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;
/
给定一个简单的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;
/