PL/SQL处理异常的基本语法
declare
begin
EXCEPTION
WHEN exception1 [or exception2] THEN
statement
WHEN exception3 [or exception4] THEN
statement
WHEN OTHERS THEN
statement
end;
异常类型:
1、预定义异常
ORACLE 本身自己已经定义了号名称的常用异常,Oracle 一共提供了25中预定义异常。
常用的有:NO_DATA_FOUND、TOO_MANY_ROWS、ZERO_DIVIDE、CASE_NOT_FOUND等
可以通过如下SQL查询ORACLE预定义的25中异常
select * from DBA_SOURCE where name='STANDARD' and text like '%EXCEPTION_INIT%'
2、非预定义异常
Oracle中很多异常都是非预定义的,他们只有错误编号和相关的错误描述,而没有名称的异常是不能被捕获的。
为了解决这个问题Oracle允许开发人员为这样的异常添加一个名称,使得他们能够被异常处理模块捕获。
示例:
-- Created on 2017/8/2 by ADMINISTRATOR
declare
v_info varchar2(200);
my_2291_exp EXCEPTION; --声明一个异常
begin
v_info:='test';
UPDATE STAFF SET STAFF.WAREA_ID=v_info WHERE STAFF.STAFF_ID=2; --此处修改STAFF一个不存在的部门
EXCEPTION
WHEN my_2291_exp THEN
DBMS_OUTPUT.put_line('违反完整约束条件,未找到父项关键字' );
DBMS_OUTPUT.put_line(SQLERRM);--异常说明
DBMS_OUTPUT.put_line(SQLCODE);--异常代码
ROLLBACK;
end;
3、自定义异常
开发中遇到与业务有关的错误,如数量不能为负数,性别必须是男或者女等。这些不属于系统错误,
因此不能使用预定义异常和非预定义异常来捕捉它们。
示例:
-- Created on 2017/8/2 by ADMINISTRATOR
declare
-- Local variables here
test_exp EXCEPTION;
PRAGMA EXCEPTION_INIT(test_exp,-20001); --错误号范围是 -20999 ~ -20000 之间的整数
begin
-- Test statements here
if 1>0 then
RAISE test_exp; -- 显式抛出异常
end if;
EXCEPTION
WHEN test_exp THEN
DBMS_OUTPUT.put_line('这里接住异常');
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('未找到匹配异常');
end;