讲oracle异常,我们首先来给oracle异常进行分类。这里多数人可能都会把oracle异常分为,预定义异常,非预定义异常以及自定义异常三类。但是我觉得这样还是不易理解和区分这几种
异常,结合所查找的资料我个人把oracle异常分成两大类,oracle异常和自定义异常。(其中oracle异常又可分为“具名异常”和“匿名异常”);
讲完了分类,我们再来具体分析一下几种异常的区别
一:
oracle异常(具名)= 预定义异常:oracle为此类异常预先指定了异常号,异常信息和异常名称;如下是一个“具名异常”使用的例子
declare
v_emp emp%rowtype;
begin
select * into v_emp from emp; --该处会捕捉到异常,然后转到异常处理部分
exception
when too_many_rows then --too_many_rows 是oracle预定义的异常名称,该异常的异常号为-01422
dbms_output.put_line(sqlcode||sqlerrm);
when others then
dbms_output.put_line(sqlcode||sqlerrm);
end;
二:
oracle异常(匿名)= 非预定义异常:oracle为此类异常预先定义了异常号,异常信息但是没有定义异常名;如下是一个“匿名异常”使用的例子
declare
deadlock exception; --定义一个异常
pragma exception_init(deadlock,-60); --把定义的异常名同匿名的异常代码结合起来
begin
raise deadlock; --(某个导致死锁的dml语句,此处我直接用了raise语句代替)
exception
when deadlock then
--(想用when..other 处理异常,那么就要有一个异常名,像死锁这个异常,没有异常名。如果想用when..other处理就要先定义---一个死锁名,并把异常名同异常代码结合。)
dbms_output.put_line('死锁');
when others then
--(当然如果异常没有命名,也可以直接用 when..other来处理,但是PL/SQL设计者建议大家尽量使用已知的EXCEPTION NAME来捕捉,不到最后,尽量不用 when..other来处理异常,可能是跟性能有关吧)
dbms_output.put_line(sqlcode||sqlerrm);
end;
从上面的例子可以看出,匿名异常处理包括三步;首先,定义异常,其次建立异常同错误号联系(使用pragma exception_init),最后在异常处理部分捕捉并处理异常。
三:
自定义异常:与oracle无关的业务逻辑异常(一般用户按业务需要定义);如下是自定义异常的一个例子
declare
myexception exception; --定义一个异常
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=7369;
if v_sal <=1000 then
raise myexception;
--报出异常,并把程序转到exception部分(注意因为该异常不是oracle定义的异常,所以这里要用raise手动来报出异常才行)
end if;
exception
when myexception then --处理异常
dbms_output.put_line('工资低于最低标准');
when others then
dbms_output.put_line(sqlcode||sqlerrm);
end;
自定义异常的处理也可以分为三个部分,首先定义异常,其次在执行部分触发异常(使用raise),最后在异常处理部分捕捉并处理异常
本文出自 “技术” 博客,请务必保留此出处http://589985.blog.51cto.com/1609992/1064539