oracle 结束exception,oracle中exception处置

当前位置:我的异常网» 数据库 » oracle中exception处置

oracle中exception处置

www.myexceptions.net  网友分享于:2013-08-01  浏览:10次

oracle中exception处理

有关于异常处理的3个知识点:

1.EXCEPTION_INT编译指示

功能是将某命名异常同某特定Oracle错误关联起来.

主用用来捕捉某特定异常错误,而不是通过OTHERS来处理.

语法:PROGMA EXCEPTION_INIT(exception_name,oracle_error_number)

SQL>

SQL> DECLARE

2   expa    EXCEPTION;

3   PRAGMA  EXCEPTION_INIT(expa,-6502);

4   vn      NUMBER(1);

5  BEGIN

6   vn:=24;

7  EXCEPTION

8   WHEN expa THEN

9     dbms_output.put_line('数字或值错误 :  数值精度太高');

10   WHEN OTHERS THEN

11     dbms_output.put_line(SQLCODE);

12     dbms_output.put_line(substr(SQLERRM,1,100));

13  END;

14  /

数字或值错误 :  数值精度太高

PL/SQL procedure successfully completed

SQL>

2.RAISE_APPLICATION_ERROR

功能用来自定义错误消息

语法: RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors])

error_number:-20 000到-20 999之间的值

error_message:必须少于512个字符

keep_errors:布尔值.为真则新的错误将被加到已存在的错误清单中(如果已存在的话),为假(默认值)则新的错误将代替当前的错误清单.

SQL> BEGIN

2   UPDATE t SET a='TEST' WHERE a='12345';

3   IF SQL%NOTFOUND THEN

4    raise_application_error(-20001,'你傻了?知道没有这样的数据还去更新!');

5   END IF;

6  EXCEPTION

7   WHEN OTHERS THEN

8    dbms_output.put_line(substr(SQLERRM,1,100));

9  END;

10  /

ORA-20001: 你傻了?知道没有这样的数据还去更新!

PL/SQL procedure successfully completed

SQL>

3.异常传播

A可执行部分发生的异常

1)如果当前语句块有该异常的处理程序则执行之,控制权交由外层语句块.

当前语句块有该异常的处理程序:

SQL> DECLARE

2   expa EXCEPTION;

3   expb EXCEPTION;

4  BEGIN

5   BEGIN

6     RAISE expa;

7   EXCEPTION

8     WHEN expa THEN

9       dbms_output.put_line('异常A产生');

10    END;

11  EXCEPTION

12   WHEN expb THEN

13    dbms_output.put_line('异常B产生');

14  END;

15  /

异常A产生

PL/SQL procedure successfully completed

SQL>

2)如果当前语句没有该异常的处理程序则通过外层语句块中产生该异常来传播该异常,然后通过外层异常处理程序按步骤1来处理.若外层没有该异常的处理程序则异常传播到调用环境.

当前语句块没有该异常的处理程序,外层语句块中产生该异常并处理

SQL> DECLARE

2   expa EXCEPTION;

3   expb EXCEPTION;

4  BEGIN

5   BEGIN

6     RAISE expb;

7   EXCEPTION

8     WHEN expa THEN

9       dbms_output.put_line('异常A产生');

10    END;

11  EXCEPTION

12   WHEN expb THEN

13    dbms_output.put_line('异常B产生');

14  END;

15  /

异常B产生

PL/SQL procedure successfully completed

SQL>

当前语句块没有该异常的处理程序,外层语句块中产生该异常且没有该异常处理程序,异常传播到调用环境

SQL> DECLARE

2   expa EXCEPTION;

3   expb EXCEPTION;

4  BEGIN

5   BEGIN

6     RAISE expb;

7   EXCEPTION

8     WHEN expa THEN

9       dbms_output.put_line('异常A产生');

10    END;

11  EXCEPTION

12   WHEN expa THEN

13    dbms_output.put_line('异常A产生');

14  END;

15  /

DECLARE

expa EXCEPTION;

expb EXCEPTION;

BEGIN

BEGIN

RAISE expb;

EXCEPTION

WHEN expa THEN

dbms_output.put_line('异常A产生');

END;

EXCEPTION

WHEN expa THEN

dbms_output.put_line('异常A产生');

END;

ORA-06510: PL/SQL: 无法处理的用户自定义异常事件

ORA-06512: 在line 6

SQL>

B声明部分发生的异常

声明部分某赋值发生异常,该异常被立即传播到外层语句块,之后按"A可执行部分发生的异常"规则来处理

SQL> BEGIN

2   DECLARE

3     vn NUMBER(1):=25;

4   BEGIN

5     NULL;

6   EXCEPTION

7     WHEN OTHERS THEN

8       dbms_output.put_line('异常在内层被处理!');

9    END;

10  EXCEPTION

11   WHEN OTHERS THEN

12    dbms_output.put_line('异常在外层被处理!');

13  END;

14  /

异常在外层被处理!

PL/SQL procedure successfully completed

SQL>

C异常部分发生的异常

异常处理器中也会产生异常,如RAISE或运行错误产生,这里异常立即被传播到外层同"B声明部分发生的异常"

例子1

SQL>

SQL> BEGIN

2   DECLARE

3     expa  EXCEPTION;

4     expb  EXCEPTION;

5   BEGIN

6     RAISE expa;

7   EXCEPTI

文章评论

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值