【游标的嵌套】mysql存储过程游标的嵌套

我们使用mysql存储过程的时候 有时候我们会遍历很多数据,那么选择游标是个不错的方法 它会帮助我们获取数据的.但是大多数时候,我们会需要嵌套游标的组合解决实际项目中的

问题.好了废话少说,我们先来认识简单的游标:

//定义循环标记

   DECLARE useraccountid INT DEFAULT 0; #用户编号

 DECLARE done TINYINT(1) DEFAULT 0;

 //查询表中的账号编号 存入变量cur1中

  DECLARE cur1 CURSOR FOR    SELECT user_account_id  FROM user_account_info '; 

#基本上每个使用游标的人都有这句话

 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;   #循环终止的标志,游标中如果没有数据就设置done为1

 

#打开游标

OPEN cur1;

            FETCH cur1 INTO useraccountid;                        

                WHILE (done=0) DO  

                           FETCH cur1 INTO useraccountid;                  

                           //逻辑处理

              //结束循环

               END WHILE ;                                                             

 //关闭游标    

 CLOSE cur1;  

上面的就是个简单的 游标模板 ,当游标中没有数据的时候 done=1 退出循环.

今天需要用到嵌套游标 在网上找了好多例子,基本上看不懂 因为本人也是第一次接触这个.既然存储过程也可以理解为一门新的编程语言,那么语言 应该是相同的.

借助于java语言的嵌套循环问题,那么游标是不是也可以这么实现了.我们就动手试试看能不能

DECLARE useraccountid int DEFAULT 0;

     DECLARE daiid int DEFAULT 0;

         DECLARE done TINYINT(1) DEFAULT 0;#是否未找到数据标记

         DECLARE cur1 CURSOR FOR select agent_account_id from agent_account_info where parent_id in ( select agent_account_id from agent_account_info where grandpa_id in (select agent_account_id from agent_account_info where agent_account=CONCAT(agentAcc)) or parent_id in (select agent_account_id from agent_account_info where agent_account=CONCAT(agentAcc)) or agent_account=CONCAT(agentAcc)) or agent_account=CONCAT(agentAcc);

         DECLARE cur2 CURSOR For select user_account_id from user_account_info WHERE user_account_type=2 and parent_id=CONCAT(daiid);

         DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;   #循环终止的标志,游标中如果没有数据就设置done为1

         #打开游标

       OPEN cur1;

                        FETCH cur1 INTO daiid;#获取数据

                WHILE done=0 DO 

                                         open cur2;

                           fetch cur2 into  useraccountid;

                                                     WHILE done=0 DO

                                                               fetch cur2 into  useraccountid;

                                                    END WHILE ;                                                        

                                        CLOSE cur2; 

 

               SET done = 0; //记得这个就行 其他的就按照你熟悉的编程语言来弄

                                FETCH cur1 INTO daiid;#获取数据

                        END WHILE ;                                                             

      CLOSE cur1;  

如果没有上面的set done=0的话 默认执行内层循环标记done=1就会终止外层的循环 也就是只能执行一次操作就会推出.

 

MySQL存储过程可以使用游标来进行数据的遍历和操作。游标嵌套是指在一个游标循环内部再使用一个或多个游标循环,以实现更复杂的数据操作。 下面是一个简单的示例,演示了如何在MySQL存储过程嵌套使用游标: ``` DELIMITER // CREATE PROCEDURE nested_cursors() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE outer_cursor CURSOR FOR SELECT id FROM table1; DECLARE inner_cursor CURSOR FOR SELECT value FROM table2 WHERE id = @current_id; OPEN outer_cursor; outer_loop: LOOP FETCH outer_cursor INTO @current_id; IF done THEN LEAVE outer_loop; END IF; OPEN inner_cursor; inner_loop: LOOP FETCH inner_cursor INTO @current_value; IF done THEN LEAVE inner_loop; END IF; -- 在这里进行数据操作,例如将数据插入到一个临时表中 END LOOP; CLOSE inner_cursor; END LOOP; CLOSE outer_cursor; END// DELIMITER ; ``` 在这个示例中,我们定义了两个游标:`outer_cursor` 和 `inner_cursor`。`outer_cursor` 用于遍历 `table1` 表中的所有记录,而 `inner_cursor` 则用于遍历 `table2` 表中与当前 `outer_cursor` 记录相关联的所有记录。 在存储过程的主循环中,我们首先打开 `outer_cursor`,然后进入一个无限循环,直到所有记录都被遍历完毕。在每次循环中,我们使用 `FETCH` 命令获取当前记录的 `id` 值,并将其存储在变量 `@current_id` 中。 接下来,我们打开 `inner_cursor`,并进入另一个无限循环,直到所有与当前 `@current_id` 相关联的记录都被遍历完毕。在每次循环中,我们使用 `FETCH` 命令获取当前记录的 `value` 值,并将其存储在变量 `@current_value` 中。 最后,在内部循环中,我们可以使用 `@current_id` 和 `@current_value` 变量进行数据操作,例如将数据插入到一个临时表中。完成内部循环后,我们关闭 `inner_cursor`,回到外部循环中,继续遍历下一个记录,直到所有记录都被遍历完毕。 注意,为了避免游标嵌套时出现问题,我们需要在每个游标的内部循环中使用唯一的变量名,否则可能会出现变量名冲突的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜七天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值