Exception是一种PL/SQL标识符,当运行的PL/SQL块出现错误或警告,则会触发异常处理。为了提高程序的健壮性,可以在PL/SQL块中引
入异常处理部分,进行捕捉异常,并根据异常出现的情况进行相应的处理。
一、异常的类型
ORACLE异常分为两种类型:系统异常、自定义异常。
其中系统异常又分为:预定义异常和非预定义异常。
1.预定义异常
ORACLE定义了他们的错误编号和异常名字,常见的预定义异常处理Oracle常见的错误
NO_DATA_FOUND
SELECT ... INTO
...
时,没有找到数据
DUL_VAL_ON_INDEX
试图在一个有惟一性约束的列上存储重复值
CURSOR_ALREADY_OPEN
试图打开一个已经打开的游标
TOO_MANY_ROWS
SELECT ... INTO
...
时,查询的结果是多值
ZERO_DIVIDE
零被整除
2.非预定义异常
ORACLE为它定义了错误编号,但没有定义异常名字。我们使用的时候,先声名一个异常名,
通过伪过程PRAGMA
EXCEPTION_INIT,将异常名与错误号关联起来。
3.自定义异常
程序员从我们业务角度出发,制定的一些规则和限制。
二、异常处理
PL/SQL中,异常处理按个步骤进行:
定义异常
抛出异常
捕获及处理异常
a.定义异常
exception_name EXCEPTION;
b.抛出异常
RAISE exception_name
c.捕获及处理异常
EXCEPTION
WHEN e_name1 [OR e_name2 ... ]
THEN
statements;
WHEN e_name3 [OR e_name4 ... ]
THEN
statements;
......
WHEN OTHERS THEN
statements;
END;
/
三、异常处理示例
1.预定义异常的例子
--演示一个整除的异常
DECLARE
v_n1 NUMBER:=50;
v_n2 NUMBER:=0;
v_n3 NUMBER;
BEGIN
v_n3:=v_n1/v_n2;
DBMS_OUTPUT.PUT_LINE('v_n3='||v_n3);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('v_n2 don't
is 0');
END;
/
--演示VALUE_ERROR(错误号ORA-06502)
scott@ORCL>
declare
2 v_ename
varchar2(3);
3
begin
4
select ename into v_ename from emp where empno=&eno;
5
dbms_output.put_line(v_ename);
6
exception
7
when value_error then
8
dbms_output.put_line('variable datatype
length is small');
9
end;
10 /
Enter value for eno:
7788
old
4:
select ename into v_ename from emp where empno=&eno;
new
4:
select ename into v_ename from emp where empno=7788;
variable datatype length is
small
PL/SQL procedure successfully completed.
--演示TOO_MANY_ROWS(对应Oracle错误号ORA-01422)
scott@ORCL>
declare
2 v_ename
emp.ename%type;
3
begin
4
select ename into v_ename from emp where deptno=&dno;
5
exception
6
when too_many_rows then
7
dbms_output.put_line('Too many rows are
returned');
8
end;
9
/
&nb