分享

PLSQL学习(三) 异常处理

 tbinspiration 2018-09-23
 
    任何一种编程语言中的异常处理部分都是比较重要的一部分,单独学习一下。
 
 
一、异常的种类及基本用法:
 
1、预定义异常(总计21种,具体见文档)
 
    使用方法:

    BEGIN

      SELECT ...

      SELECT ...

      SELECT ...

       ...

    EXCEPTION  

    WHEN NO_DATA_FOUND THEN ...

 
    常用类型:

    NO_DATA_FOUND       --ORA-01403-- 未找到行

    TOO_MANY_ROWS       --ORA-01422--SELECT INTO 语句返回多行数据

    VALUE_ERROR         --ORA-06502-- 类型转换错误

    ZERO_DIVIDE         --ORA-01476-- 程序尝试除以 0

 STORAGE_ERROR       --ORA-06500--PL/SQL 运行时内存溢出或内存不足

 

2、非预定义异常(EXCEPTION_INIT )

 

    方法一:

    需要在declare中申明,申明后使用即与预定义异常相同

    declare

      e_deptno_remaining exception ;

       PRAGMA EXCEPTION_INIT (e_deptno_remaining, - 2292 );

    begin

    ...

    exception

    when e_deptno_remaining then

    dbms_output.put_line( ' 非预定义2292 ' );

    when others then

    dbms_output.put_line( 'others' );

    end ;

 

-2292必须是oracle自定义的错误号,前面加负号

如果需要自己设定,则必须在-20000——-20999之间

此方法无法定义异常信息。

 

    方法二:

    错误号与错误信息均可自己定义

    且无需在declare和exception中声明

    declare

      i int := 5;

    begin

     if i=5then

     raise_application_error (-20086/*-20000——-20999*/, '自定义错误信息');

     endif;

    end;

 

3、自定义异常(分为declare、raise、exception三部分)
 
    使用示例:

    declare

      i int := 3;

      ex exception;

    begin

      if i <=2then

      raise ex;

      else dbms_output.put_line(i);                             

      endif;

    exception

      when ex then

      dbms_output.put_line('xxx');

    end;

 

 

二、注意使用Others的异常类:

 

    在EXCEPTION中定义任何的异常后

    尽量都使用when others

    表示遭遇到除此之外的任何异常如何处理

 

    EXCEPTION

      WHEN exception_name1 THEN   -- handler

        sequence_of_statements1

      WHEN exception_name2 THEN   -- another handler

        sequence_of_statements2

        ...

      WHENOTHERSTHEN            -- optional handler

        sequence_of_statements3

    END

 

    另外,在EXCEPTION中可以使用OR链接

    WHEN over_limit OR under_limit OR VALUE_ERROR THEN

 

 

三、使用系统错误号和错误信息

 

    错误号----SQLCODE;

    错误信息--SQLERRM;

    DECLARE

      err_num   NUMBER;

      err_msg   VARCHAR2(100);

    BEGIN

      ...

    EXCEPTION

      WHENOTHERSTHEN

        err_num    := SQLCODE;

        err_msg    := SUBSTR(SQLERRM, 1, 100);

        dbms_output.put_line(err_num || '---' || err_msg);

    END;

 

 

四、异常传播的规则

 

    首先,异常是会向他的外层进行传递的

    即如果在当前子块中未定义异常处理,则会传递到外层的异常处理

    直到异常被捕获或最终被抛弃

 

    注:声明中的异常必定无法被当前块捕获

    DECLARE

    Abc number(3):='abc';

    ...

    BEGIN

    ...

    EXCEPTION

    WHENOTHERSTHEN

    ...

    END;----即便使用others最终也无法捕获

 

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多