zoukankan      html  css  js  c++  java
  • 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
    

    执行结果:

  • 相关阅读:
    类型“System.Windows.Markup.IUriContext”在未被引用的程序集中定义 解决办法
    c# 根据文件流查看文件真实格式
    WPF ListBoxItem 使用Command命令添加双击事件
    MVVM 在使用 ItemsSource 之前,项集合必须为空
    WPF 自定义TextBox,可控制键盘输入内容
    百万数据如何在前端快速流畅显示?
    NodeJS npm 包装包失败的解决方案
    node.js express 4.x 安装指南(Express不是内部或外部命令解决方案)
    IIS8 不能在此路径中使用此配置节。如果在父级别上锁定了该节
    Npoi操作excel
  • 原文地址:https://www.cnblogs.com/XiaoZhengYu/p/12934285.html
Copyright © 2011-2022 走看看