自定义PL/SQL异常

 

PL/SQL代码中,我们除了可以使用Oracle预定义的Exception,还可以自定义属于自己的异常。但是,使用自定义异常要注意的是,异常的声明、定义和抛出场景,都是要编写者手工自己完成。

 

 

声明异常类型变量

 

PL/SQL中,异常Exception可以作为一种变量类型使用。如果需要使用自定义异常,则首先需要在declare声明段中声明出异常类型变量。声明使用EXCEPTION关键字进行。

 

当我们需要将这个异常抛出的时候,只需要使用raise语句。就可以直接中断当前的代码运行流程,进入Exception处理代码段。在异常处理段中,使用when进行系列匹配,将匹配上的异常变量进行拦截。见下面代码示例:

 

set serveroutput on size 10000;

set timing on;

 

declare

  n_count number;

  too_many exception; --定义一个异常类型变量;

begin 

  select count(*)

  into n_count

  from dba_objects;

 

  if (n_count>10000) then

     raise too_many;  --使用raise抛出异常;

  end if; 

 

  dbms_output.put_line('Normal Stop !');

exception

  when no_data_found then

      dbms_output.put_line('No Data Found !');

  when too_many then  --使用变量名称进行拦截

      dbms_output.put_line('User-Defined Exception found : too_many'); 

  when others then

      dbms_output.put_line('Other Happened !');       

end;

/

 

输出结果:

 

SQL>

 

User-Defined Exception found : too_many 

 

PL/SQL procedure successfully completed

 

Executed in 0.09 seconds

 

 

说明一点,我们在使用自定义异常的使用。一定要进行异常的抛出,而且是显示的进行异常抛出。对比Oracle预定义异常,这个差异很大。预定义的异常,是Oracle自己进行检测,并且抛出。而用户自定义的异常经常是从业务角度看的特殊流程,所以必然是需要手工的进行异常抛出。

 

 

自定义异常信息的错误代码

 

Oracle的预定义异常,都有一个负整数的错误代码,如ORA-0001。自定义异常,我们也是可以定义配置一个错误代码的。在进行绑定的时候,我们需要在异常声明出使用PRAGMA EXCEPTION_INIT关键字。

 

declare

  n_count number;

  too_many exception;

  pragma exception_init(too_many,-20010); --将too_many异常与-20010代码绑定上;

begin 

  select count(*)

  into n_count

  from dba_objects;

 

  if (n_count>10000) then

     raise too_many;

  end if; 

 

  dbms_output.put_line('Normal Stop !');

exception

  when others then

      --既然实现了绑定,也就是可以进行输出错误编码!

      dbms_output.put_line('Some Happened ! ORA'||sqlcode||'-- '||sqlerrm);       

end;

/

 

执行结果:

SQL>

 

Some Happened ! ORA-20010-- ORA-20010:

 

PL/SQL procedure successfully completed

 

Executed in 0.11 seconds

 

 

如此,我们就实现了将一个自定义错误与一个数字进行绑定的需求。此处注意一下,Oracle预定义异常已经占用了很多ORA-XXXXX错误编号,为自定义异常预留的号段为:-20000到-20999。我们自定义使用时要注意错误编号的范围。

 

 

对异常信息进行信息输出

 

至此,我们实现了自定义异常的定义、捕获和错误编码关联。还有一个功能,就是错误信息提示。我们常常需要在报出这个错误的时候,输出一些信息来帮助我们进行调错。一个简单的message提示,会大大加快我们debug的速度。

 

我们刚刚使用raise关键字进行抛出异常,如果需要加入提示信息,就需要使用raise_application_error函数。示例如下:

 

set serveroutput on size 10000;

set timing on;

 

declare

  n_count number;

  too_many exception;

  pragma exception_init(too_many,-20010);

begin 

  select count(*)

  into n_count

  from dba_objects;

 

  if (n_count>10000) then

     --将错误编码-20010的编码错误抛出(也就是too_many),并且提示出错误信息;

     raise_application_error(-20010,'User Defined Too many Exception !');

  end if;   

  dbms_output.put_line('Normal Stop !');

exception

  when too_many then

      dbms_output.put_line('TOO_MANY Happen : '||sqlerrm);

  when others then

      dbms_output.put_line('Some Happened ! ORA'||sqlcode||'-- '||sqlerrm);       

end;

/

 

输出结果:

SQL>

//too_many在when中拦截住了错误,输出了自定义信息!

TOO_MANY Happen : ORA-20010: User Defined Too many Exception !

 

PL/SQL procedure successfully completed

 

Executed in 0.111 seconds

 

 

当然,我们也可以不使用异常声明,直接抛出异常。

 

declare

  n_count number; --我们没有声明错误变量,没有绑定编码

begin 

  select count(*)

  into n_count

  from dba_objects;

 

  if (n_count>10000) then

     --直接抛出错误

     raise_application_error(-20010,'User Defined Too many Exception !');

  end if;   

  dbms_output.put_line('Normal Stop !');

exception 

  when others then 使用通常拦截

      dbms_output.put_line('Some Happened ! '||sqlerrm);        

end;

/

 

输出结果:

SQL>

 

Some Happened ! ORA-20010: User Defined Too many Exception !

 

PL/SQL procedure successfully completed

 

Executed in 0.07 seconds

 

 

到此,我们已经可以获得自定义异常错误的全部结论。

 

ü        如果你希望抛出异常后,针对不同的异常进行不同的逻辑处理,在Exception中分类拦截出来。那么,请声明出一个异常类型变量;

ü        如果你希望你的声明异常有一个编码与之对应。请使用pragma exception_init将一个预定义数字与其绑定住;

ü        如果你希望在抛出异常错误中,带有一些提示自定义信息。那就是用raise_application_error方法,将错误编码和提示信息一并抛出;

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17203031/viewspace-687896/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/17203031/viewspace-687896/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值