ITPub博客

首页 > Linux操作系统 > Linux操作系统 > RAISE_APPLICATION_ERROR

RAISE_APPLICATION_ERROR

原创 Linux操作系统 作者:sudn 时间:2011-06-26 14:29:58 0 删除 编辑

平时用来测试的异常处理
我们都是通过dbms_output.put_line来输出异常信息,但是在实际的应用中,需要把异常信息返回给调用的客户端。
其实 RAISE_APPLICATION_ERROR 是将应用程序专有的错误从服务器端转达到客户端应用程序(其他机器上的SQLPLUS或者其他前台开发语言)

raise_application_error(异常类型,传递信息)

异常类型:number() 值域:-20000 -20999

传递信息:varchar22000

DBMS_STANDARD包的RAISE_APPLICATION_ERROR过程,可以重新定义异常错误消息,它为应用程序提供了一种与ORACLE交互的方法。语法如下

RAISE_APPLICATION_ERROR(errorNumber,errorString)

errorNumber是数值在-20000-20999之间,errorString为自定义的错误信息。

如:

update jobs set job_title = v_newJobTitle where job_id = v_jobid;

if sql%notfound then

   RAISE_APPLICATION_ERROR(-20167,'update failure!');

end if;

..........

当在sqlpus中测试时,一旦没有要更新的行,则抛出这样的异常:

ORA-20167: update failure!

oracle的异常分为编译时异常(错误)和运行时异常,前者不能被处理,后者可以被处理。
我们主要讨论运行时异常。

异常类型:
a
、预定义异常
     
已命名的预定义异常有CURSOR_ALREADY_OPENINVALID_NUMBERTOO_MANY_ROWS
b
、用户定义异常
c
、已命名异常(已命名异常不能单独归为一类异常,但它有点特别,所以我将它单独罗列说明)
     
如果希望处理一个异常(when子串处理),那么异常必须有一个名字,如TOO_MANY_ROWS
     
数据库错误有数千个,但是只有不到25个是内建的已命名异常(这些异常都声明在standard包中)
     
要处理那些未命名的异常时,你可以将一个名字和一个错误号联系在一起,达到这个目的的语句是pragma exception_init语句;

抛出异常:
a
、通过pl/sql运行时引擎
     
当数据库或pl/sql在运行时发生错误时,一个异常被pl/sql运行时引擎自动抛出
b
、使用raise语句
     
异常也可以通过raise语句抛出:raise exception_name;
c
、调用raise_application_error存储过程

处理异常&异常传播:
a
、一旦程序进入异常部分就不能再回到同一块的执行部分;当异常被处理后,控制返回到外层执行部分的下一条语句;
b
、如果有when others子串,则必须放置在最后面作为缺省处理器处理没有显式处理的异常;
c
、执行部分抛出的异常将首先传递到同一块的异常部分,如果在同一块的异常部分没有处理这个异常的处理器,那么异常将会传播到上一层的异常部分中,一直到最外层;
d
、异常被处理后如果你仍然希望它继续传播,可以在异常处理的最后执行不带参数的raise语句(raise语句将重新抛出出现的异常,允许它继续传播)

--这是一个上面部分知识点的示例(伪代码)说明
declare
...
user_define_exception exception; --
用户定义异常
invalid_column_name exception;
--
补充说明:如果我们在程序块中使用了无效列名,会有括号中的错误提示(ORA-00904:invalid column name)
--
下面我们将这个异常代码号与我们自定义的异常进行关联,即为异常命名
pragma exception_init(invalid_column_name,-904);
begin
...
--raise user_define_exception; --
可以显式引发异常
exception
when TOO_MANY_ROWS then --
预定义异常处理
    ...;
when user_define_exception then --
用户定义异常处理
    ...;
when invalid_column_name then --PRAGMA EXCEPTION_INIT
异常处理
    ...;
    raise;    --
继续传播该异常
end;

sqlcodesqlerrm
a
、另外一种处理数据库错误的方法是使用内建函数sqlcodesqlerrm
b
sqlcode将返回现行数据库错误号,这些错误号中除了no_data_found+100外其他都是负数;
c
sqlerrm返回文本描述的错误信息;
d
、为了获得用户自定义异常返回的sqlerrmsqlcode,你需要使用raise_application_error函数给自定义异常标注错误号

给自定义错误标注号码:
a
raise_application_error内建函数用于抛出一个异常并给异常赋予一个错误号以及错误信息;
b
、自定义异常的缺省错误号是+1,缺省信息是user_defined_exception。来自未处理的异常的一般信息对于识别导致错误的原因没有帮助,
c
raise_application_error函数能够在pl/sql程序块的执行部分和异常部分调用,显式抛出带特殊错误号的命名异常;
d
、使用语法:raise_application_error(error_no,error_message[,{true|| false}]);
e
、错误号的范围是-20,001-20,999;错误信息是文本字符串,最多为2048字节;truefalse表示是添加(true)进错误堆(error stack)还是覆盖(overwrite)错误堆(false)。缺省情况下是false

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

请登录后发表评论 登录
全部评论

注册时间:2008-12-20

  • 博文量
    73
  • 访问量
    147751