ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 自定义PL/SQL异常

自定义PL/SQL异常

原创 Linux操作系统 作者:realkid4 时间:2011-02-24 21:52:48 0 删除 编辑

 

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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
求道~

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    7753790