我们使用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) |