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