MySQL 游标循环未完成就中止了
今天运行 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;