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就会终止外层的循环 也就是只能执行一次操作就会推出.

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值