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;