PLSQL学习(三) 异常处理

来源:互联网 发布:下载itools软件 编辑:程序博客网 时间:2024/05/18 11:37

http://www.blogjava.net/decode360/archive/2008/08/09/281460.html


任何一种编程语言中的异常处理部分都是比较重要的一部分,单独学习一下。
 
 
一、异常的种类及基本用法:
 
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(SQLERRM1100);

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

    END;

 

 

四、异常传播的规则

 

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

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

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

 

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

    DECLARE

    Abc number(3):='abc';

    ...

    BEGIN

    ...

    EXCEPTION

    WHENOTHERSTHEN

    ...

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


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 冰箱的管子破了怎么办 淘宝京东e卡冻结怎么办 苏宁任性付冻结怎么办 苏宁订单删除了怎么办 联通销户话费有余额怎么办 暖气改地热不热怎么办 老楼房暖气不热怎么办 4s店修不好车怎么办 苏宁的发票丢了怎么办 京东退货没有发票怎么办 发票发错了邮箱怎么办 苹果手机忘记电子邮箱验证码怎么办 退差价把红包退还了怎么办 网上购票票丢了怎么办 岗位人手不够老板又不招人来怎么办 辞职后提成不发怎么办 老板给客户吵架员工该怎么办 冰柜声音大怎么办嗡嗡响 交了钱电没有怎么办 小白熊电动吸奶器显示F1怎么办 花洒的水变小了怎么办 手机插卡处坏了怎么办 吉利帝豪一键启动钥匙没电怎么办 居民医保断交5年怎么办 社保和医保断了怎么办 停缴了两年社保怎么办 医保交不够20年怎么办 医保断交4个月怎么办 医保断交5个月怎么办 换城市后社保卡怎么办 苹果6s呼叫失败怎么办 苹果手机打电话显示呼叫失败怎么办 苹果手机经常呼叫失败怎么办 苹果手机呼叫号码呼叫失败怎么办 好友把我拉黑了怎么办 有人一直打骚扰电话怎么办 每天都有骚扰电话怎么办 苹果7被电话轰炸怎么办 苹果手机接听声音小怎么办 微信账号封了怎么办 在京东买的手机出现问题怎么办