Oracle 异常处理

来源:互联网 发布:查看java.exe占用端口 编辑:程序博客网 时间:2024/05/17 05:12
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;   --定义异常exBEGIN  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出现了异常,但当前块中没有针对该异常的处理机,就会寻找外部块中有没有处理机,如果所有的外部块都不能处理这个异常,则就会在宿主环境中出现未经处理的异常。

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

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

 

0 0
原创粉丝点击