Oracle -- plsql异常处理

来源:互联网 发布:雷欧团灭mac的怪兽 编辑:程序博客网 时间:2024/05/19 18:46
1. 什么是异常 ?
    Oracle中出现错误的情形通常分为编译时错误(compile-timeerror)和运行时错误(run-time error),异常是在PL/SQL执行过     程中出现的警告或错误。
2. 异常是如何触发的 
      – 发生了一个 Oracle 错误时
      – 使用RAISE语句显式触发

3. 如何处理异常 ?
      – 用处理机截获
      – 在调用环境中传播异常

4. 两种触发异常方法:

  发生了 Oracle 错误,就会自动触发相关的异常。

    可以在块中使用RAISE语句显式的触发异常。被触发的异常可以是预定义的异常,也可以是自定义的异常。




5. 截获异常

    如果在块的执行部分异常被触发,当前的块就会转去执行异常处理部分的相应异常处理机。如果PL/SQL成功处理了异常,     就不会把异常传播给外部块或环境,从而,PL/SQL块正常结束。


6. 异常的传播

    如果在块的执行部分异常被触发, 然而没有相应的异常处理机,块就会异常终止,而将异常传递给调用环境。

    错误引发异常,每当引发异常时,都将控制权传递给异常处理程序,异常处理程序处理异常.


捕获异常:

[plain] view plaincopy
  1. EXCEPTION  
  2.   WHEN exception1 [OR exception2 . . .] THEN  
  3.     statement1;  
  4.     statement2;  
  5.     . . .  
  6.   [WHEN exception3 [OR exception4 . . .] THEN  
  7.     statement1;  
  8.     statement2;  
  9.     . . .]  
  10.   [WHEN OTHERS THEN  
  11.     statement1;  
  12.     statement2;  
  13.     . . .]  


在异常部分WHEN 子句没有数量限制
WHEN OTHERS 是最后一个子句
异常处理部分从关键字EXCEPTION开始
当异常抛出后,控制无条件转到异常处理部分
在离开块之前只能执行一种异常处理

7. 预定义异常:

    预定义异常是由 Oracle 为常见错误预先定义的,不需要显式声明。

    在相应的异常处理例程中引用错误的标准名来截获一个Oracle 服务器预定义错误。


例子:

[plain] view plaincopy
  1. DECLARE  
  2.     v_sal       emp.sal%type;  
  3. BEGIN  
  4.     SELECT  sal  INTO v_sal   
  5.     FROM emp  
  6.     WHERE empno=999;  
  7. EXCEPTION  
  8.     WHEN NO_DATA_FOUND then  
  9.         dbms_output.put_line('没有查到数据');  
  10.     WHEN others then  
  11.         dbms_output.put_line('其它异常');  
  12. END;  

要截获Oracle服务器没有预定义的错误,需先声明这个错误或者使用OTHERS处理机。 



8. 非预定义异常(自定义异常):

    8.1. 在声明部分声明异常名。

            语法:

            exception      EXCEPTION;

            其中:  exception  异常名

    8.2.  使用PRAGMAEXCEPTION_INIT语句将异常处理名字和Oracle的错误代码关联起来.

            语法:

   PRAGMA   EXCEPTION_INIT ( exception, error_number ) ;

           其中:  exception  先前声明的异常名

           error_number  标准Oracle 错误代码

    8.3. 在相应的异常处理例程中引用已声明的异常。

            关键字 PRAGMA (伪指令pseudoinstructions)表示语句是一个编译指令,在执行PL/SQL块时并不处理该语句。在                      PL/SQL块中,一个编译指令EXCEPTION_INIT告诉编译器将一个异常处理的名字和一个Oracle错误代码联系起来。

[plain] view plaincopy
  1. DECLARE  
  2.      e_emp_cons     EXCEPTION;  
  3.     PRAGMA EXCEPTION_INIT(e_emp_cons,-00001);  
  4. BEGIN  
  5.     INSERT INTO emp    
  6.         SELECT * FROM emp;  
  7. EXCEPTION  
  8.     WHEN e_emp_cons   THEN  
  9.        dbms_output.put_line('违反唯一性约束');  
  10. END;  

捕获异常的函数:

SQLCODE

  返回Oracle的错误代码

SQLERRM

  返回和错误值相关联的信息

  SQLCODE值  说明

   0      没有异常   

  100      NO_DATA_FOUND异常

  负数      其它Oracle错误号


自定义异常:

     在PL/SQL块的声明部分声明。

     使用RAISE语句显式地发布 。

0 0