文章目录
1、异常概念
异常情况处理( EXCEPTION )是用来处理正常执行过程中未预料的事件 (错误),由于 PL/SQL 程序块一旦产生异常而没有指出如何处理时,程序就会自动终止整个程序运行。反之,则跳转至
最近的 EXCEPTION进行处理
1.1 思维导图
1.2 语法格式
基本格式:
begin
程序代码
exception
when XX异常 then
处理异常
when others then
其他情况下的异常处理。
end;
!!!请注意:异常处理可以按任意次序排列,但 OTHERS 必须放在最后 !!!
------------------------- 举例说明 ------------------------
DECLARE
v_num NUMBER(5) := 5;
BEGIN
BEGIN
v_num := v_num / 0;
EXCEPTION -- 如果此处无 exception,则抛向最近一个 exception
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM || ' : ' || SQLCODE);
dbms_output.put_line(dbms_utility.format_call_stack);
dbms_output.put_line(dbms_utility.format_error_backtrace);
END;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM || ' : ' || SQLCODE); -- 异常信息 及 编号
dbms_output.put_line(dbms_utility.format_call_stack); -- 异常堆栈
dbms_output.put_line(dbms_utility.format_error_backtrace); -- 异常发生列
END;
2、异常类型及抛出
2.1 系统级
2.1.1 预定义异常
ORACLE 预定义的异常情况大约有24个。对这种异常情况的处理,无需在程序中定义,由 ORACLE 自动将其引发。如:‘违反了唯一性约束’
create table stu (
id number primary key,
xm nvarchar2
);
insert all
into(id, xm) values(1, '小游子');
into(id, xm) values(2, '小倩子');
-- 数据准备结束 --
DECLARE
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO stu(ID, xm) VALUES(1, ''a'')';
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM ||' : '||SQLCODE);
END;
输出:ORA-00001: 违反唯一约束条件 (SYSTEM.SYS_C0014451) : -1
2.2 用户级
程序执行过程中,出现编程人员认为的非正常情况。对这种异常情况的处理,需要用户在程序中定义,然后 显式抛出。
2.2.1 raise
1、在 PL/SQL 块的定义部分定义异常情况:
<异常情况 - 变量> EXCEPTION;
2、RAISE <异常情况 - 变量>。
3、在 Exception 中对异常进行处理。
DECLARE
v_num NUMBER(5) := 5;
exp1 EXCEPTION;
exp2 EXCEPTION;
BEGIN
IF v_num >= 0 THEN
RAISE exp1;
END IF;
IF v_num < 0 THEN
RAISE exp2;
END IF;
EXCEPTION
WHEN exp1 THEN
dbms_output.put_line('v_num 为:'||v_num||' 大于0');
WHEN exp2 THEN
dbms_output.put_line('v_num 为:'||v_num||' 小于0');
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM ||' : '||SQLCODE);
END;
2.2.2 raise_application_error
调用 DBMS_STANDARD ( ORACLE 提供的包)包所定义的RAISE_APPLICATION_ERROR 过程,可以重新定义异常错误消息,它为应用程序提供了一种与 ORACLE 交互的方法。
raise_application_error(error_number, error_message, error_boolean);
error_number : 取值范围: -20000 到 -20999 之间
error_message:相应的提示信息(< 2048 字节),超出则截取。
error_boolean : 可选项,若为 true: 则新错误将被添加到已经引发的错误列表中。
若为 false(默认):则覆盖。
DECLARE
v_num NUMBER(5) := 5;
BEGIN
BEGIN
v_num := v_num / 0;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM||' : '||SQLCODE);
dbms_output.put_line(dbms_utility.format_error_backtrace);
raise_application_error(-20000, '自定义错误:除数为 0 ', TRUE);
END;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM||' : '||SQLCODE);
dbms_output.put_line(dbms_utility.format_error_backtrace);
END;
输出结果:
ORA-01476: 除数为 0 : -1476
ORA-06512: 在 line 5
ORA-20000: 自定义错误:除数为 0
ORA-01476: 除数为 0 : -20000 -- false 则 无此项!
ORA-06512: 在 line 10
3、重写异常
系统预定义异常 + 用户自定义异常 皆可。
DECLARE
remaining EXCEPTION; -- 1、异常声明
PRAGMA EXCEPTION_INIT(remaining, -1); -- 2、异常初始化,此处的 ‘-1’ 就是 sqlcode
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO stu(ID, xm) VALUES(1, ''a'')';
EXCEPTION
WHEN remaining THEN
dbms_output.put_line('吾所行之事,不可你也!'); -- 重写
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM ||' : '||SQLCODE);
END;