leave和iterate必须配合显式标签使用,否则报错;leave后须跟已声明的标签名,仅作用于对应loop、while、repeat或带标签begin...end块,可跳出循环或整个过程逻辑。

LEAVE 和 ITERATE 不是通用跳转语句,必须配合显式标签使用,否则直接报错 —— 这是绝大多数人踩坑的第一步。
LEAVE 必须带标签名,且标签只能作用于它声明的块
MySQL 不允许写 LEAVE; 或 LEAVE loop;(当 loop 未定义时)。标签必须提前出现在 LOOP、WHILE、REPEAT 或带标签的 BEGIN ... END 前。一旦声明,LEAVE 只能跳出该标签所包裹的整个结构。
-
LEAVE可用于循环内,也可用于带标签的BEGIN ... END块中(比如提前退出整个过程逻辑) - 嵌套时若想跳出外层,必须给外层块加标签,例如
outer_block: BEGIN ... LEAVE outer_block; - 常见错误:
my_loop: WHILE i 是合法的;但若漏掉 <code>my_loop:,或写成LEAVE;,MySQL 会报ERROR 1305 (42000): FUNCTION LEAVE does not exist(误解析为函数调用)
ITERATE 只能在循环内部使用,且不能跳到外部循环
ITERATE 的作用是“跳过本次剩余语句,立刻进入下一次迭代”,但它不是 continue 的自由版 —— 它必须指向当前所在循环的标签,不能跨层引用。
-
ITERATE仅支持三种循环:LOOP、WHILE、REPEAT;在BEGIN ... END块里单独用会报语法错误 - 典型陷阱:在
WHILE循环体里忘了手动递增计数器,又用了ITERATE,结果条件永远不满足,陷入死循环 - 示例中易错写法:
my_while: WHILE i IF i % 2 != 0 THEN ITERATE my_while; END IF;<br> SET sum = sum + i;<br>END WHILE;
——这里i没变,奇数时反复ITERATE,i永远卡住
嵌套循环中标签命名必须唯一且作用域清晰
MySQL 不检查标签是否“语义合理”,只做字面匹配。同名标签在不同嵌套层级会导致 LEAVE 跳出意料之外的块。
- 不要在内外层都用
loop_label:;推荐用语义化命名,如calc_daily_loop:、retry_connect_loop: -
LEAVE inner_loop;在内层循环里是安全的;但若外层也叫inner_loop:,MySQL 会按最近作用域匹配,可能跳错 - 调试建议:在复杂嵌套中,每个
LEAVE/ITERATE后加注释说明目标块,例如-- LEAVE calc_daily_loop: exit after 30 days
最容易被忽略的一点:LEAVE 跳出的是「结构块」,不是「某一行」。哪怕你只差一句 UPDATE 就完成逻辑,LEAVE 也会让它彻底不执行 —— 所以条件判断的位置,比你想的更关键。











