oracle pl/sql 异常

oralce 异常:
1.系统异常
2.自定义异常

一、
定义->发现-》抛出-》捕获-》处理

1.声明定义

PROCEDURE procname (parameter1,...) IS
 exception_name EXCEPTION;
 variable_name TYPE;
 BEGIN
    body
 EXCEPTION
    WHEN NO_DATA_FOUND
    THEN
        ....
    WHEN exception_name
    THEN
        ....
END;

2.抛出
RAISE exception_name;


3.捕获
WHEN exception_name THEN

二、
EXCEPTION_INIT 预编译指令

PROCEDURE my_proc IS
invalid_month EXCEPTION;
PRAGMA EXCEPTION_INIT(invalid_month,-1843);
BEGIN
….
EXCEPTION
WHEN invalid_month THEN

注:
PRAGMA EXCEPTION_INIT(NAME,INTEGER);
整数不能使用 -1403,0,100外的正数,小于100000的负数
用户可使用 -20999 -20000
不指定则默认为 1

三、
打包自定义EXCEPTION

CREATE OR REPLACE PACKAGE err_nums
IS
num_too_young CONSTANT NUMBER := -200001;
num_too_big CONSTANT NUMBER := -200002;
ex_too_young EXCEPTION;
PRAGMA EXCEPTION_INIT(ex_too_young,-200001);
ex_too_big EXCEPTION;
PRAGMA EXCEPTION_INIT(ex_too_big,-200002);
END err_nums;

CREATE OR REPLACE PROCEDURE test(birthdate IN DATE) IS
min_years CONSTANT PLS_INTEGER := 18;
BEGIN
IF ADD_MONTHS(SYSDATE,min_years*12-1) < birthdate THEN
RAISE_APPLICATION_ERROR(err_nums.num_too_young,’YOUR AGE IS TOO YOUNG’);
END IF;
END;

四、
Oracle 内置包中很少通过 init 指定名字。
默认是在 standard 包中。
sqlcode 返回数字和简短描述
自定义的异常一般都是在所在代码块有效。

五、抛出
RAISE exception;
RAISE package.exception;
RAISE 只能用到 when 中, 用于异常外传

RAISE_APPLICATION_ERROR 抛出应用专有异常

PROCEDURE RAISE_APPLICATION_ERROR(NUM BINARY_INTEGER,MSG VARCHAR2,KEEPERRORSTACK BOOLEAN DEFAULT FALSE);

六、处理
WHEN 捕获异常
只能根据名称而不是代码捕获异常。
WHEN 1 OR 2
Y

内置错误函数
sqlcode
sqlerrm 512B 字符串
DBMS_UTILITY.FORMAT_ERROR_STACK 1899个字符
DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 文本和行号
DBMS_UTILITY.FORMAT_ERROR_CALL_STACK 调用堆栈 可能只会输出最外层异常信息

异常后处理其他内容,可以设置多个块
SAVE EXCEPTIONS DBMS_ERROR_LOG

WHEN OTHERS

七、其他
异常管理策略,deliberate、unfortunate、unexpected
参考其他错误管理工具
标准化的错误管理工具
建立错误模板

参考书籍 : Oracle pl/sql 程序设计 第五版

你可能感兴趣的:(oracle)