一、前言
异常分为三类,预定义异常、非预定义异常、自定义异常。
注意:三种异常的区别,前两种异常是违反了oracle的规则,用户自定义异常是违反了用户定义的规则。
异常处理的语法:
EXCEPTION
WHEN first_exception THEN
WHEN second_exception THEN
WHEN OTHERS THEN
END;
二、预定义异常
ORACLE预定义的异常情况大约有21个。对这种异常情况的处理,无需在程序中定义声明,由ORACLE自动将其引发。
常见的异常有:
1、no_data_found 无数据找到
2、too_many_rows 返回多条数据
3、zero divide 除数不能零
4、cursor_already_open 打开已经打开的游标
5、value_error 赋值异常
6、invalid_cursor 失效的游标
7、dup_val_on_index 唯一索引插入重复值,即违反了主键约束
declare
v_emp emp%rowtype;
begin
select empno, ename into v_emp.empno, v_emp.ename from emp; --信息数据返回多行
dbms_output.put_line(v_emp.empno || '和' || v_emp.ename);
--异常处理
exception
when too_many_rows then
dbms_output.put_line('返回数据过多!');
end;
三、非预定义异常
非预定义指的是,行为违反了oracle的规则,有报错编号和报错信息,但是系统并未定义异常名称,那么我们自己将这种错误定义一个名字,并将名字和错误号绑定。
declare
--定义异常
FK exception;
--错误跟定义好的错误变量想关联
pragma exception_init(FK, -02292); --当报-02292错误码的时候,定义错误为“FK”
begin
delete from dept where deptno = 30;--如果没有异常处理,将报-02292,事实上是违反了外键约束
exception
--错误处理
when FK then --当出现‘v_deptno_error’错误时,报“没有该部门编号!”
dbms_output.put_line('违反了外键约束!');
end;
四、自定义异常
将某种错误是为异常,即出现某种情况,就可以定义其为异常。需要显性抛出(raise)。
自定义一个异常,并抛出:
declare
v_sal emp.sal%type;
v_sal_error exception;
begin
select sal into v_sal from emp where empno = &empno;
if (v_sal < 3000) then
--2、定义抛出异常编码值raise_application_error(code错误码, '错误信息'),出现错误提示弹窗
raise_application_error(-20000, '薪资问题,小伙子注意啦,要开除啦');
end if;
end;
自定义一个异常,并处理:
declare
v_sal emp.sal%type;
v_sal_error exception;
begin
select sal into v_sal from emp where empno = &empno;
if (v_sal < 3000) then
--1、抛出异常
raise v_sal_error; --抛出了异常名就一定要有处理,否则会报错
else
dbms_output.put_line(v_sal);
end if;
exception
when v_sal_error then
dbms_output.put_line('薪资少于3000');
when others then --其他任意异常
dbms_output.put_line('系统异常');
end;