> 数据库 > MySQL >

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




(责任编辑:IT)