oracle exception_init,Oracle pragma 举例:exception_init

PRAGMA是一个编译指示(或命令)。编译指示在编译时被处理,它们不在运行时执行。编译指示是对编译程序发出的特殊指令。它也称为伪指令(pseudoinstruction),不会改变程序的含义。它只是向编译程序传递信息 ,实际上它是非常类似于嵌在 SQL 语句的注释中的性能调整提示。

EXCEPTION_INIT:将一个特定的错误号与程序中所声明的异常标示符关联起来。

示例:PRAGMA EXCEPTION_INIT(DEADLOCK_DETECTED, -60);

EXCEPTION_INIT编译指令,即EXCEPTION的初始化。语法也简单,PRAGMA EXCEPTION (exception_name, error_number);在处理EXCEPTION 是,当没有已经定义好了的EXCEPTION NAME可用时,我们就用OTHERS来处理未被捕捉的所有的EXCEPTION,PL/SQL设计者建议大家尽量使用已知的EXCEPTION NAME来捕捉,不到最后,www.linuxidc.com尽量不用这个选项,虽然不知道为什么,但估计是跟性能有关,而且编译出来的代码应该会很长。

这个编译指令的引入也为这带来了解决方案。比如,我们要捕捉死锁这个EXCEPTION怎么办? 系统没有预定义好的EXCEPTION NAME可用。这时我们就可以用这个编译指令了。

ora-60错误是代表死锁的意思,那我们就可以为这个错误号起一个EXCEPTION NAME,比如DEADLOCK_DETECTED,语法如下:

DECLARE

DEADLOCK_DETECTED EXCEPTION;

PRAGMA EXCEPTION_INIT(DEADLOCK_DETECTED, -60);

好我们就可以像下面一样来捕捉处理这个死锁的EXCEPTION了。

EXCEPTION

WHEN DEADLOCK_DETECTED THEN

......

这样,我们就避免了用when others then来捕捉处理这个异常了。

这个编译指令几乎可以用在所有的程序的声明项中,但要注意作用范围,另外要注意的是记住只为一个错误号起一个EXCEPTION NAME。

下面附上一段通过SQLERRM函数找出Oracle预定义的错误号码及相应的错误信息。www.linuxidc.com这在10g版本通过,在之前的版本可能会报buffer overflow错误,这是由于set serveroutput on默认为2000字节,但在10g中默认是unlimited了。

SET SERVEROUTPUT ON

SPOOL ERRORMSG.LOG

DECLARE

VMSG VARCHAR2(500);

BEGIN

FOR I IN 0..20000 LOOP

VMSG := SQLERRM(-I);

IF INSTR(VMSG,'not found') = 0 THEN

DBMS_OUTPUT.PUT_LINE(VMSG);

END IF;

END LOOP;

END;

/

SPOOL OFF

下面看一个例子

create or replace procedure SP_Del_Test

(P_ItemAdmin in mfitem.itemadmin%type, --ItemAdmin

P_ItemCd    in mfitem.itemcd%type, --ItemCode

P_Return    out number --输出参数

) is

exp exception;

PRAGMA Exception_Init(exp, -2292);

begin

delete from mfitem t

where t.itemcd = P_ItemCd

and t.itemadmin = P_ItemAdmin;  --这一句会引发-2292异常,有级连删除异常

EXCEPTION

WHEN EXP THEN

P_Return := 9;

ROLLBACK;

WHEN OTHERS THEN

ROLLBACK;

end SP_Del_Test;0b1331709591d260c1c78e86d0c51c18.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值