讲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),最后在异常处理部分捕捉并处理异常