我们在写存储过程的时候,通常会用到游标,游标的格式为:
DECLARE i_done tinyint(1) default 0;//定义是否继续循环的标志
DECLARE cur_execution cursor for
select i_test1,i_test2 from t ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET i_done=1; //定义没有找到游标了就标志位就设置为1,要结束循环
open cur_execution ;//打开游标
exe_loop:LOOP//exe_loop为自定义的名字
fetch cur_execution into v_test1,v_test2;
if i_done =1 then
leave exe_loop;//如果标志位为1了就结束循环
end if;
select * from tableName;
................
//这里是你要处理的过程,可以写很多的语句,包括select语句等
end loop;
close cur_execution ;//关闭游标
在处理过程中,我发现如果在处理过程的过程当中,如果有一个select语句没有查询出数据,就会结束循环,这不是我们想要的,我们想要的即时是在其中的一个select 语句中没有查询的数据,也要继续循环,知道游标定义的数据全部循环完。
为了避免这种情况出现,我们需要在每个select 语句后重置循环标志位为0,让他继续循环下去;
select * from tableName;
set i_done = 0;//这里很关键