PL/SQL中用CONTINUE WHEN跳出当前循环迭代,仅Oracle 11gR2+支持,需配合WHEN子句或标签使用;EXIT WHEN仅终止整个最近层循环,非跳过本次迭代。
PL/SQL里怎么跳出当前循环(不是整个循环体)
用 continue,不是 exit,也不是 exit when。很多人误以为 exit when 能跳过本次迭代,其实它只终止整个循环——这点在嵌套循环里特别容易踩坑。
比如你在 FOR i IN 1..10 LOOP 里想跳过偶数,写 EXIT WHEN MOD(i,2)=0,结果循环直接在 i=2 就结束了,后面全不执行。
-
CONTINUE是 Oracle 11gR2+ 才支持的,老版本会报PLS-00103: Encountered the symbol "CONTINUE" - 必须配合
WHEN子句使用,单独写CONTINUE语法错误 - 支持带标签的
CONTINUE label_name WHEN ...,用于跳出外层循环的某次内层迭代
FOR i IN 1..5 LOOP
IF i = 3 THEN
CONTINUE; -- 跳过 i=3 这一轮,继续 i=4
END IF;
DBMS_OUTPUT.PUT_LINE(i);
END LOOP;EXIT WHEN 的真实作用范围和常见误用
EXIT WHEN 只对**最近一层**的循环生效,且是“立刻终止”,不执行后续语句。它不是条件跳转,更不是 continue 的替代品。
典型误用:在 WHILE 循环里混用 EXIT WHEN 和循环条件本身,导致逻辑重复或提前退出。
- 如果
WHILE condition LOOP ... EXIT WHEN NOT condition;,等于多写了一层判断,还可能因 condition 变化不同步而出错 - 在游标循环中写
EXIT WHEN c%NOTFOUND是标准写法,但必须放在FETCH之后、处理逻辑之前 -
EXIT WHEN后面不能跟复合表达式(如EXIT WHEN a > 10 AND b IS NULL),虽然语法允许,但可读性差,建议提前提取为布尔变量
CONTINUE 在嵌套循环中的标签用法
没标签的 CONTINUE 只影响当前循环;加标签才能控制外层。标签名不是随便起的——必须紧贴循环开头,且中间不能有空行或注释打断。
比如你想在外层 FOR i、内层 FOR j 中,当 j=2 时跳过当前 i 的所有剩余 j,就得用带标签的 CONTINUE。
- 标签必须用 > 包裹,且名字不能和变量同名,否则编译报
PLS-00363: expression 'name' cannot be used as an assignment target -
CONTINUE outer_loop WHEN j = 2;会让控制权回到 > 的下一次迭代起点,而不是继续内层循环 - Oracle 不支持
CONTINUE TO label这种写法,只能是CONTINUE label WHEN ...
<<outer_loop>>
FOR i IN 1..3 LOOP
FOR j IN 1..4 LOOP
IF j = 2 THEN
CONTINUE outer_loop; -- 直接跳到 i=2 的开始
END IF;
DBMS_OUTPUT.PUT_LINE('i='||i||', j='||j);
END LOOP;
END LOOP outer_loop;兼容性与性能要注意的硬伤
CONTINUE 看似方便,但在跨版本迁移或维护遗留系统时,它是第一个被砍的语法点。而 EXIT WHEN 虽老派,但从 Oracle 7 一直稳到现在。
- PL/SQL Developer 或 SQL*Plus 的某些旧版本(如 v10.0.3 以下)对
CONTINUE解析不稳定,可能报错或静默忽略 - 用
GOTO模拟CONTINUE是可行的,但 Oracle 官方文档明确说 “GOTO is not recommended”,且容易破坏块结构 - 性能上两者无差异,但
CONTINUE多一次条件判断跳转,实际开销可忽略;真正影响性能的是循环体内的 SQL 执行,不是控制流关键字
真正在意兼容性,就别碰 CONTINUE;真需要跳过迭代,用 IF ... THEN NULL; ELSE ... END IF; 最稳妥。标签、版本、工具链——这三个地方漏查一个,上线就卡住。

















