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 程序设计 第五版