今天运行MySQL存储过程的时候,发现游标循环只执行了一半。原因出在这个地方
DECLARE CONTINUE HANDLER FOR NOT FOUND SET end_flag = 1;
这个语句的意思是整个存储过程中,如果查询没有找到结果, end_flag就会被置为1。
如果我们的循环这样写:
OPEN cur_pos;
label_r: LOOP
FETCH cur_pos INTO nId;
IF end_flag=1 THEN
LEAVE label_r;
END IF;
SELECT name into nName FROM sample WHERE id=nId limit 1;
END LOOP label_r;
CLOSE cur_pos;
在 select 的时候,很可能没查到数据。没查到以后,end_flag为1,光标就会跳出循环。
解决方案
如果实在需要 select ,我们可以这样改进,避免跳出循环:
IF EXISTS (select 1 FROM sample WHERE id=nId) THEN
SELECT name into nName FROM sample WHERE id=nId limit 1;
END IF;