日期:2014-05-16  浏览次数:20414 次

oracle中exception处理
有关于异常处理的3个知识点:

1.EXCEPTION_INT编译指示
功能是将某命名异常同某特定Oracle错误关联起来.
主用用来捕捉某特定异常错误,而不是通过OTHERS来处理.
语法:PROGMA EXCEPTION_INIT(exception_name,oracle_error_number)

SQL>
SQL> DECLARE
  2   expa    EXCEPTION;
  3   PRAGMA  EXCEPTION_INIT(expa,-6502);
  4   vn      NUMBER(1);
  5  BEGIN
  6   vn:=24;
  7  EXCEPTION
  8   WHEN expa THEN
  9     dbms_output.put_line('数字或值错误 :  数值精度太高');
10   WHEN OTHERS THEN
11     dbms_output.put_line(SQLCODE);
12     dbms_output.put_line(substr(SQLERRM,1,100));
13  END;
14  /
数字或值错误 :  数值精度太高

PL/SQL procedure successfully completed

SQL>



2.RAISE_APPLICATION_ERROR
功能用来自定义错误消息
语法: RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors])
error_number:-20 000到-20 999之间的值
error_message:必须少于512个字符
keep_errors:布尔值.为真则新的错误将被加到已存在的错误清单中(如果已存在的话),为假(默认值)则新的错误将代替当前的错误清单.

SQL> BEGIN
  2   UPDATE t SET a='TEST' WHERE a='12345';
  3   IF SQL%NOTFOUND THEN
  4    raise_application_error(-20001,'你傻了?知道没有这样的数据还去更新!');
  5   END IF;
  6  EXCEPTION
  7   WHEN OTHERS THEN
  8    dbms_output.put_line(substr(SQLERRM,1,100));
  9  END;
10  /
ORA-20001: 你傻了?知道没有这样的数据还去更新!

PL/SQL procedure successfully completed

SQL>



3.异常传播

A可执行部分发生的异常
1)如果当前语句块有该异常的处理程序则执行之,控制权交由外层语句块.

当前语句块有该异常的处理程序:
SQL> DECLARE
  2   expa EXCEPTION;
  3   expb EXCEPTION;
  4  BEGIN
  5   BEGIN
  6     RAISE expa;
  7   EXCEPTION
  8     WHEN expa THEN
  9       dbms_output.put_line('异常A产生');
10    END;
11  EXCEPTION
12   WHEN expb THEN
13    dbms_output.put_line('异常B产生');
14  END;
15  /
异常A产生

PL/SQL procedure successfully completed

SQL>


2)如果当前语句没有该异常的处理程序则通过外层语句块中产生该异常来传播该异常,然后通过外层异常处理程序按步骤1来处理.若外层没有该异常的处理程序则异常传播到调用环境.

当前语句块没有该异常的处理程序,外层语句块中产生该异常并处理
SQL> DECLARE
  2   expa EXCEPTION;
  3   expb EXCEPTION;
  4  BEGIN
  5   BEGIN
  6     RAISE expb;
  7   EXCEPTION
  8     WHEN expa THEN
  9       dbms_output.put_line('异常A产生');
10    END;
11  EXCEPTION
12   WHEN expb THEN
13    dbms_output.put_line('异常B产生');
14  END;
15  /
异常B产生

PL/SQL procedure successfully completed

SQL>

当前语句块没有该异常的处理程序,外层语句块中产生该异常且没有该异常处理程序,异常传播到调用环境
SQL> DECLARE
  2   expa EXCEPTION;
  3   expb EXCEPTION;
  4  BEGIN
  5   BEGIN
  6     RAISE expb;
  7   EXCEPTION
  8     WHEN expa THEN
  9       dbms_output.put_line('异常A产生');
10    END;
11  EXCEPTION
12   WHEN expa THEN
13    dbms_output.put_line('异常A产生');
14  END;
15  /