[转帖]自定义PL/SQL异常_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 4372 | 回复: 0   主题: [转帖]自定义PL/SQL异常        下一篇 
kim
注册用户
等级:中校
经验:1729
发帖:222
精华:0
注册:2011-7-21
状态:离线
发送短消息息给kim 加好友    发送短消息息给kim 发消息
发表于: IP:您无权察看 2011-9-15 10:50:35 | [全部帖] [楼主帖] 楼主

在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


 whenothersthen使用通常拦截

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方法,将错误编码和提示信息一并抛出;




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论