oracle的异常处理

(1)   预定义异常

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

规则:对这种异常情况的处理,只需在PL/SQL块的异常处理部分,直接引用相应的异常情况名,并对其完成相应的异常错误处理即可。

示例:

DECLARE

   v_empno  employees.employee_id%TYPE := &empno;

   v_sal      employees.salary%TYPE;

BEGIN

   SELECT salary INTO v_sal FROMemployees WHERE employee_id = v_empno;

   IF v_sal<=1500 THEN

        UPDATE employees SET salary= salary + 100 WHERE employee_id=v_empno;

        DBMS_OUTPUT.PUT_LINE('编码为'||v_empno||'员工工资已更新!');    

   ELSE

        DBMS_OUTPUT.PUT_LINE('编码为'||v_empno||'员工工资已经超过规定值!');

   END IF;

EXCEPTION

   WHEN NO_DATA_FOUND THEN 

      DBMS_OUTPUT.PUT_LINE('数据库中没有编码为'||v_empno||'的员工');

   WHEN TOO_MANY_ROWS THEN

      DBMS_OUTPUT.PUT_LINE('程序运行错误!请使用游标');

   WHEN OTHERS THEN

     DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);

END;

 

 

(2)   非预定义异常

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

规则:使用非预定义异常包括三步:

Ø  在PL/SQL 块的定义部分定义异常情况:

<异常情况>  EXCEPTION;

Ø   将其定义好的异常情况,与标准的ORACLE错误关联起来,使用EXCEPTION_INIT语句:

PRAGMA EXCEPTION_INIT(<异常情况>, <错误代码>);

Ø  在异常处理部分捕捉并处理异常。 

示例:

DECLARE

v_deptno departments.department_id%TYPE := &deptno;

E_deptno_remaining EXCEPTION;--1、定义部分

PRAGMA EXCEPTION_INIT(e_deptno_remaining, -2292);--2、建立与oracle代码关联关系

/* -2292 是违反一致性约束的错误代码 */

BEGIN

DELETE FROM departments WHERE department_id = v_deptno;

EXCEPTION

 WHEN e_deptno_remainingTHEN   ---3、捕获异常处理

 DBMS_OUTPUT.PUT_LINE('违反数据完整性约束!');

WHEN OTHERS THEN

 DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);

END;

(3)   用户自定义异常

预定义异常和非预定义异常都与Oracle错误有关,一个异常错误相关的错误出现时,就会隐含触发该异常错误。用户定义的异常错误是通过显式使用 RAISE 语句来触发。当引发一个异常错误时,控制就转向到 EXCEPTION块异常错误部分,执行错误处理代码。

规则:对于这类异常情况的处理,步骤如下:

Ø  在PL/SQL 块的定义部分定义异常情况:

<异常情况>  EXCEPTION;

Ø   在执行部分(BEGIN)触发异常RAISE <异常情况>;

Ø  在异常处理部分(EXCEPTION)捕捉并处理异常。

示例:

DECLARE

   v_empno employees.employee_id%TYPE:=&empno;

   no_result EXCEPTION;

BEGIN

   UPDATE employees SET salary = salary+100WHERE employee_id = v_empno;

   IF SQL%NOTFOUND THEN

      RAISE no_result;

   END IF;

EXCEPTION

   WHEN no_result THEN

      DBMS_OUTPUT.PUT_LINE('你的数据更新语句失败了!');

   WHEN OTHERS THEN

     DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);

END;

(4)   用户定义异常

调用DBMS_STANDARD(ORACLE提供的包)包所定义的RAISE_APPLICATION_ERROR过程,可以重新定义异常错误消息,它为应用程序提供了一种与ORACLE交互的方法。

RAISE_APPLICATION_ERROR 的语法如下:

RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors] );

这里的error_number 是从 –20,000 到 –20,999 之间的参数,

   error_message 是相应的提示信息(< 2048 字节),

  keep_errors 为可选,如果keep_errors =TRUE ,则新错误将被添加到已经引发的错误列表中。

如果keep_errors=FALSE(缺省),则新错误将替换当前的错误列表。

示例:

CREATEOR REPLACE Procedure cdop_Appoplanex_Upd

(

    in_OURID cdop_Appoplanex.OURID % type,   

    in_MAINID cdop_Appoplanex.MAINID %type,  

    in_WEEK cdop_Appoplanex.WEEK % type,   

    in_AMTIMEID cdop_Appoplanex.AMTIMEID %type,    

    in_AMAPPOLIMIT cdop_Appoplanex.AMAPPOLIMIT% type,  

    in_AMAPPOS cdop_Appoplanex.AMAPPOS %type,    

    in_PMTIMEID cdop_Appoplanex.PMTIMEID %type

)

As

    err_NotFind Exception;  --用户自定义异常

Begin

/*=========================================================

创建:

说明:

更改历史:

1.:更改说明

=========================================================*/

    Update cdop_Appoplanex Set

        OURID = in_OURID,

        MAINID = in_MAINID,

        WEEK = in_WEEK,

        AMTIMEID = in_AMTIMEID,

        AMAPPOLIMIT = in_AMAPPOLIMIT,

        AMAPPOS = in_AMAPPOS

    Where OurID = in_OurID;

If SQL%ROWCOUNT=0 THEN

        Raise err_NotFind;

EndIf;

EXCEPTION

Whenerr_NotFind Then

 Raise_application_error (-20998, '该项目不存在,可能行版本已经过期或已被其他用户删除![HIS]');

WhenOTHERS Then

    His_ErrorCenter (SQLCODE, SQLERRM);

End cdop_Appoplanex_Upd;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值