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  /

DECLARE
expa EXCEPTION;
expb EXCEPTION;
BEGIN
BEGIN
   RAISE expb;
EXCEPTION
   WHEN expa THEN
     dbms_output.put_line('异常A产生');
  END;
EXCEPTION
WHEN expa THEN
  dbms_output.put_line('异常A产生');
END;

ORA-06510: PL/SQL: 无法处理的用户自定义异常事件
ORA-06512: 在line 6

SQL>

B声明部分发生的异常
声明部分某赋值发生异常,该异常被立即传播到外层语句块,之后按"A可执行部分发生的异常"规则来处理

SQL> BEGIN
  2   DECLARE
  3     vn NUMBER(1):=25;
  4   BEGIN
  5     NULL;
  6   EXCEPTION
  7     WHEN OTHERS THEN
  8       dbms_output.put_line('异常在内层被处理!');
  9    END;
10  EXCEPTION
11   WHEN OTHERS THEN
12    dbms_output.put_line('异常在外层被处理!');
13  END;
14  /
异常在外层被处理!

PL/SQL procedure successfully completed

SQL>

C异常部分发生的异常
异常处理器中也会产生异常,如RAISE或运行错误产生,这里异常立即被传播到外层同"B声明部分发生的异常"

例子1
SQL>
SQL> BEGIN
  2   DECLARE
  3     expa  EXCEPTION;
  4     expb  EXCEPTION;
  5   BEGIN
  6     RAISE expa;
  7   EXCEPTI



你可能感兴趣的:(oracle,sql)