在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/