• MySQL游标与嵌套循环


    游标嵌套遍历


    user表:

    CREATE DEFINER=`root`@`localhost` PROCEDURE `test`()
    BEGIN
        DECLARE user1 VARCHAR(100);
        DECLARE user2 VARCHAR(100);
        DECLARE done INT DEFAULT 0;
        DECLARE cursor_user1 CURSOR FOR(SELECT `name` FROM `user`); -- 定于游标1
        DECLARE cursor_user2 CURSOR FOR(SELECT `name` FROM `user`); -- 定义游标2
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; -- 结束标识
        
        OPEN cursor_user1; -- 开启游标1
        loop_1: LOOP -- 外层循环
        -- -------------------------------------------------------------------------------------
    			# 尝试从游标1指向的数据集合获取数据,如果集合已经遍历完毕,done的值被设置为1。
    			FETCH cursor_user1 INTO user1;
    			IF done = 1 THEN LEAVE loop_1; END IF; -- 外层循环结束条件
    			
    			OPEN cursor_user2; -- 开启游标2
    			loop_2: LOOP -- 内层循环
    			-- -----------------------------------------------------------------------------
    					# 尝试从游标2指向的数据集合获取数据,如果集合已经遍历完毕,done的值被设置为1。
    					FETCH cursor_user2 INTO user2;
    					IF done = 1 THEN LEAVE loop_2; END IF; -- 内层循环结束条件
    					
    					# do something...
    					
    		    -- -----------------------------------------------------------------------------
    			END LOOP loop_2;
    			CLOSE cursor_user2; -- 关闭游标2
    			
    			SET done = 0; -- important
        -- ------------------------------------------------------------------------------------
        END LOOP loop_1;
        CLOSE cursor_user1; -- 关闭游标1
    END
    

    测试

    user表数据:

    CREATE DEFINER=`root`@`localhost` PROCEDURE `test`()
    BEGIN
        DECLARE result VARCHAR(2000) DEFAULT 'result';
        DECLARE user1 VARCHAR(100);
        DECLARE user2 VARCHAR(100);
        DECLARE done INT DEFAULT 0;
        DECLARE cursor_user1 CURSOR FOR(SELECT `name` FROM `user`); -- 定于游标1
        DECLARE cursor_user2 CURSOR FOR(SELECT `name` FROM `user`); -- 定义游标2
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; -- 结束标识
        
        OPEN cursor_user1; -- 开启游标1
        loop_1: LOOP -- 外层循环
        -- -------------------------------------------------------------------------------------
    			# 尝试从游标1指向的数据集合获取数据,如果集合已经遍历完毕,done的值被设置为1。
    			FETCH cursor_user1 INTO user1;
    			IF done = 1 THEN LEAVE loop_1; END IF; -- 外层循环结束条件
    			
    			OPEN cursor_user2; -- 开启游标2
    			loop_2: LOOP -- 内层循环
    			-- -----------------------------------------------------------------------------
    					# 尝试从游标2指向的数据集合获取数据,如果集合已经遍历完毕,done的值被设置为1。
    					FETCH cursor_user2 INTO user2;
    					IF done = 1 THEN LEAVE loop_2; END IF; -- 内层循环结束条件
    					
    					# do something...
    					SET result = CONCAT(result,';',user1,'-',user2);
    					
    		    -- -----------------------------------------------------------------------------
    			END LOOP loop_2;
    			CLOSE cursor_user2; -- 关闭游标2
    			
    			SET done = 0; -- important
        -- ------------------------------------------------------------------------------------
        END LOOP loop_1;
        CLOSE cursor_user1; -- 关闭游标1
    	SELECT result; 
    END
    

    执行结果:

  • 相关阅读:
    Git 历史/术语/命令/基本操作
    SQL 术语/语法/基本操作-必知必会
    bootstrap cdn地址
    IDEA 快捷键 大幅提高工作效率
    Django3 模版配置/过滤器/markdown=9
    Django3 路由文件位置/文件格式/路由传值=8
    Django3 创建项目/app全流程=7
    VS Code Django解决不必要报错
    Django3 如何使用静态文件/如何自定义后台管理页面=6
    Django3 如何编写单元测试和全面测试=5
  • 原文地址:https://www.cnblogs.com/XiaoZhengYu/p/12934285.html
Copyright © 2020-2023  润新知