Mysql存储过程多个游标使用方法记录(游标内定义游标)2020-09-15 05:46:17
问题描述:在存储过程中定义好了一个游标cur1,获取其中的参数作为另一个游标cur2的查询条件。
例:#定义游标1---获取tableName1表的id
DECLARE cur1 CURSOR FOR SELECT id FROM tableName1 ;
#定义游标2---假设此处条件的id是cur1中获得的id
DECLARE cur2 CURSOR FOR SELECT pid FROM tableName2
WHERE pid = id;
这样并排定义2个游标cur2中id的值是无法获取到。然而在cur1游标体内直接定义cur2显然是不行的。DECLARE done INT DEFAULT FALSE;
#定义游标1---获取tableName1表的id
DECLARE cur1 CURSOR FOR SELECT id FROM tableName1 ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur1;
WHILE NOT done DO
FETCH cur1 into @m_id;
IF NOT done THEN
#这样定义cur2显然是不行的
DECLARE cur2 CURSOR FOR SELECT pid FROM tableName2 WHERE pid = @m_id;
END IF;
END WHILE;
CLOSE cur1;
解决的办法就是需要重新定义一个begin-end模块,将cur2在该模块下重新定义一遍即可。DECLARE done INT DEFAULT FALSE;
#定义游标1---获取tableName1表的id
DECLARE cur1 CURSOR FOR SELECT id FROM tableName1 ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur1;
WHILE NOT done DO
FETCH cur1 into @m_id;
IF NOT done THEN
#定义一个新的begin-end模块
BEGIN -- cur2 begin
DECLARE inner_done INT DEFAULT FALSE ;
#@m_id即为cur1中获得的id
DECLARE cur2 CURSOR FOR SELECT pid FROM tableName2 WHERE pid = @m_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET inner_done = TRUE ;
OPEN cur2 ; -- 打开内层cur2游标
WHILE NOT inner_done DO
FETCH cur2 INTO @m_pid ;
IF NOT inner_done THEN
#你的操作
END IF;
END WHILE ; -- END cur2 WHILE
CLOSE cur2; -- 循环结束后,关闭内层cur2游标
END; -- cur2 end
END IF;
END WHILE;
CLOSE cur1;
特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。
Tags 标签