Oracle Pl/SQL 异常流

Oracle Pl/SQL Exception Flow

给定一个简单的SP,比如;

CREATE OR REPLACE PROCEDURE TEST1
AS
BEGIN
   EXECUTE IMMEDIATE 'truncate table missingtable';
   dbms_output.put_line('here');
EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE != -942 THEN
         RAISE;
      END IF;
END;

我从来没有得到输出语句,我认为控制权返回到同一个块,这是唯一的块..是的,如果我尝试截断它,missingtable 会报告 -942。

这是一个逻辑问题,实际上会发生异常,但您编写的代码仅在 return 代码与 942 不同时才引发异常。

如果您想继续第一个块中的 dbms_output,您需要一个内部异常

CREATE OR REPLACE PROCEDURE TEST1
AS
BEGIN
   BEGIN
     EXECUTE IMMEDIATE 'truncate table missingtable';
   EXCEPTION
      WHEN OTHERS THEN
          IF SQLCODE != -942 THEN
             RAISE;
          ELSE
             NULL;
          END IF;
    END;
    
    dbms_output.put_line('here');
END;
/