预定义异常:
declare
v_num number;
begin
v_num := 100/ 0;
exception
--除数不为0
when zero_divide then
DBMS_OUTPUT.PUT_LINE( '1');
--其他异常
when others then
DBMS_OUTPUT.PUT_LINE( '2');
end;
以上是异常处理的基本语法,输出如下:
OTHERS表示所有的异常,从输出可以看出PL/SQL的异常处理机制和java的不同,自上而下被第一个异常处理块处理完之后就跳出异常处理。
--以下sql可以查询所有数据库预定义异常
SELECT * FROM DBA_SOURCE T WHERE T.name = 'STANDARD' AND T.TEXT LIKE '%EXCEPTION_INIT%';
非预定义异常:
oracle 中更多的是非预定义异常。也就是说,他们只有错误编码和相关的错误秒速,而没有名称的异常是不能被不错的。例如:
执行以下sql:
update SYS_CUST_1111 t set t.areaid=1;
会得到如下结果:
可以用以下方法捕捉以上异常(类似上面的
SELECT
*
FROM
DBA_SOURCE T
WHERE
T.name =
'STANDARD'
AND
T.TEXT
LIKE
'%EXCEPTION_INIT%'
的text字段内容):
declare
v_sql varchar2( 400);
my_942_exception exception;
pragma EXCEPTION_INIT (my_942_exception, -942);
begin
v_sql:='update SYS_CUST_1111 t set t.areaid=1';
execute immediate v_sql;
exception
when my_942_exception then
DBMS_OUTPUT.PUT_LINE( '1111');
end;
输出结果如下:
自定义异常:
例子如下:
--自定义异常
declare
v_num number := 1;
test_exception exception;
pragma exception_init (test_exception,-20001);
begin
if v_num= 1 then
raise test_exception;
end if;
end;
执行会有如下结果:
注意:错误号的范围是-20999~-20000的负数,这个范围内的错误号可以随便使用,不用担心被占用。
可以使用
raise_application_error抛出带说明的异常:
declare
v_num number := 1;
begin
if v_num= 1 then
raise_application_error(- 20001,'错误啦!!' );
end if;
end;
结果: