zoukankan      html  css  js  c++  java
  • Oracle 异常处理

    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出现了异常,但当前块中没有针对该异常的处理机,就会寻找外部块中有没有处理机,如果所有的外部块都不能处理这个异常,则就会在宿主环境中出现未经处理的异常。

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

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

  • 相关阅读:
    Intouch 制作自定义登录弹窗
    ifix vba 读取计算机中的txt文件,截取字符串显示
    intouch 开发源程序加密方法
    语音报警系统说明
    ifix历史数据(H04/H08/H24)转换为CSV文件导出
    ifix 自动化(Automation)错误弹窗的解决方案
    云平台制作(二)-平台展示
    knudson hypothesis 二次突变假说
    纯合子,杂合子,杂合性缺失
    zero-base coordinate 和one-base coordinate
  • 原文地址:https://www.cnblogs.com/wakey/p/4498807.html
Copyright © 2011-2022 走看看