Ethon

为什么要有方法,因为懒惰是一种美德。

   :: 首页  :: 新随笔  ::  ::  :: 管理
1、什么是异常
PL/SQL中的一个警告或错误的情形都可被称为异常。包括编译时错误(PLS)和运行时错误(ORA)。一个异常通常包含一个错误代码和错误文本,分别指示异常的编号和具体错误信息。
 
异常情况处理(EXCEPTION)是用来处理正常执行过程中未预料的事件,程序块的异常处理预定义的错误和自定义错误,由于PL/SQL程序块一旦产生异常而没有指出如何处理时,程序就会自动终止整个程序运行。
 
2、异常的分类

    1. 预定义 ( Predefined )错误

    ORACLE预定义的异常情况大约有24个。对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。

    2. 非预定义 ( Predefined )错误

    即其他标准的ORACLE错误。对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发。

    3. 用户定义(User_define) 错误

   程序执行过程中,出现编程人员认为的非正常情况。对这种异常情况的处理,需要用户在程序中定义,然后显式地在程序中将其引发。

 

3、异常的结构

EXCEPTION  
  WHEN exception1 [OR exception2 . . .] THEN  
    statement1;  
    statement2;  
    . . .  
  [WHEN exception3 [OR exception4 . . .] THEN  
    statement1;  
    statement2;  
    . . .]  
  [WHEN OTHERS THEN  
    statement1;  
    statement2;  
    . . .] 

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

 

 4、异常类型

    4.1 预定义异常

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

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

DECLARE
  test varchar(10);
BEGIN
  SELECT DNAME INTO test FROM DEPT WHERE DEPTNO='11';
  DBMS_OUTPUT.PUT_LINE(test);
EXCEPTION
  WHEN NO_DATA_FOUND THEN
  DBMS_OUTPUT.PUT_LINE('没有找到符合条件的数据');
  WHEN TOO_MANY_ROWS THEN
  DBMS_OUTPUT.PUT_LINE('返回的数据行过多');
  WHEN OTHERS THEN
  DBMS_OUTPUT.PUT_LINE('EORROR:'||SQLCODE||'-'||SQLERRM);
END;

 

    4.2 非预定义异常

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

    语法:

    exception      EXCEPTION;

    其中:  exception  异常名

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

    语法:

   PRAGMA   EXCEPTION_INIT ( exception, error_number ) ;

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

    error_number  标准Oracle 错误代码

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

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

DECLARE  
     e_emp_cons     EXCEPTION;  
    PRAGMA EXCEPTION_INIT(e_emp_cons,-00001);  
BEGIN  
    INSERT INTO emp    
        SELECT * FROM emp;  
EXCEPTION  
    WHEN e_emp_cons   THEN  
       dbms_output.put_line('违反唯一性约束');  
END; 

 

    4.3 自定义异常

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

    使用RAISE语句显式地发布

DECLARE
  name varchar(10);
  ex EXCEPTION;   --定义异常ex
BEGIN
  SELECT DNAME INTO name FROM DEPT WHERE DEPTNO='10';
  DBMS_OUTPUT.PUT_LINE(name);
  IF NAME<>'HR' THEN
  RAISE ex;        --触发异常
  END IF;
EXCEPTION
  WHEN ex THEN
  DBMS_OUTPUT.PUT_LINE('10号部门不是HR');  --处理异常
END;

 

 4、异常的传递

当子块自己处理异常时,它可以正常终止,并且在子块的END语句之后可以立即将控制交给外部块。

然而,如果 PL/SQL出现了异常,但当前块中没有针对该异常的处理机,就会寻找外部块中有没有处理机,如果所有的外部块都不能处理这个异常,则就会在宿主环境中出现未经处理的异常。

当把异常传播给外部块,则当前块中的等待执行代码都不再被执行。

这种方法的优点就是内部块仅处理自己特有的错误,而将一般的异常处理留给外部块。

 

posted on 2015-05-12 22:13  Ethon  阅读(505)  评论(0编辑  收藏  举报