Oracle PL/SQL存储过程捕获ORA-00942异常后未执行后续语句问题
问题原因
你对PL/SQL的异常控制流规则理解有误,这是该现象的核心诱因:
- PL/SQL的块执行规则为:
BEGIN和EXCEPTION之间的正常代码段中,只要某一行执行抛出未被当场捕获的异常,控制流会直接跳转到当前块的EXCEPTION异常处理段,异常发生行之后的所有同块内正常代码都会被直接跳过,不会执行,无论后续异常是否被捕获处理。 - 对应你的存储过程执行流程:
- 先执行
EXECUTE IMMEDIATE 'truncate table missingtable';,因目标表不存在抛出ORA-00942错误 - 控制流直接跳转到当前块的
EXCEPTION段,不会再执行后面的dbms_output.put_line('here');语句 - 异常段判断错误码为-942后未重抛,存储过程正常结束,因此始终看不到对应输出。
- 先执行
修复方案
如果需要dbms_output语句正常执行,可以把可能抛出异常的截断逻辑单独封装在子PL/SQL块中,子块的异常处理完成后会回到父块继续执行后续代码,示例如下:
CREATE OR REPLACE PROCEDURE TEST1 AS BEGIN -- 子块封装可能抛异常的逻辑 BEGIN EXECUTE IMMEDIATE 'truncate table missingtable'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END; -- 子块异常处理完成后,父块后续代码正常执行 dbms_output.put_line('here'); END; /
内容的提问来源于stack exchange,提问作者Kurt
相关产品推荐
相关产品推荐

