mysql存储过程游标的嵌套 – CSDN博客

我们使用mySQL存储过程的时候 有时候我们会遍历很多数据,那么选择游标是个不错的办法

来源: mysql存储过程游标的嵌套 – CSDN博客

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

分享到: 更多 (0)