现在的位置: 首页 > 综合 > 正文

oracle的异常处理函数

2013年08月18日 ⁄ 综合 ⁄ 共 1041字 ⁄ 字号 评论关闭
 

Q1:oracle用户自定义异常处理相关。
A1:Exception_init编译指令,即exception的初始化。语法为pragma exception(exception_name,error_number)。在处理exception时,如果没有已经定义好的exception name可以使用,我们就只能用others来处理并捕捉所有的exception,PL/SQL设计者建议大家尽量使用已知的exception name来捕捉,而尽量避免使用others选项。这估计跟性能有关,而且编译出来的代码应该更长。Exception_init编译指令的引入就是为了解决系统没有定义name的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
    ….
这个编译指令几乎可以用在所有的程序的声明项中,但是要注意作用范围,另外要注意的是只为一个错误号起一个exception name。其实简单点说,exception_init编译指令就是为知道错误号但系统没为对应错误号定义name的exception起名,这种状态下,编码时不需要使用raise手工抛出异常,而是监控程序对应的异常。而如果数据库编码者不知道错误对应的错误号,或者只是用户处理逻辑上的错误,则需要在对应错误出现时使用raise抛出异常。
另外:我们可以使用sqlerrm函数来找出oracle预定义的错误号码及对应的错误信息:
Declare
 Vmsg varchar2(500);
For I in 0..20000 loop
 Vmsg := sqlerrm(-I);
 Dbms_output.put_line(vmsg);
End loop;
再另:我们可以使用函数raise_application_error(exception_number,exception_message)来抛出自定义的错误信息,其中exception_number的范围为-20000~-20999。

 

抱歉!评论已关闭.