异常处理通常用于测试
我们都是通过dbms_output.put_line输出异常信息,但在实际应用中,需要将异常信息返回给调用客户端。
事实上,RAISE_APPLICATION_ERROR将应用程序特定的错误从服务器传输到客户端应用程序(SQLPLUS或其他机器上的其他前端开发语言)
raise_application_error(异常类型,传输信息)
异常类型:number() 值范围:-20000 到 -20999
传递信息:varchar2(2000)
DBMS_STANDARD包的RAISE_APPLICATION_ERROR过程可以重新定义异常错误消息,这为应用程序与ORACLE交互提供了一种方式。语法如下
RAISE_APPLICATION_ERROR(错误编号,错误字符串)
errorNumber 是-20000 到-20999 之间的一个值,errorString 是自定义的错误消息。
喜欢:
更新作业集 job_title = v_newJobTitle 其中 job_id = v_jobid;
如果 sql%notfound 那么
RAISE_APPLICATION_ERROR(-20167,'更新失败!');
结束如果;
…………
在 sqlpus 中测试时,一旦没有要更新的行oracle存储过程异常处理,就会抛出如下异常:
ORA-20167: 更新失败!
Oracle的异常分为编译时异常(错误)和运行时异常。前者不能处理,后者可以处理。
我们主要讨论运行时异常。
异常类型:
一个。预定义的异常
命名的预定义异常包括 CURSOR_ALREADY_OPEN、INVALID_NUMBER、TOO_MANY_ROWS 等。
b.用户定义的异常
c.命名异常(命名异常不能被归类为单独的异常类别,但它们有点特殊,所以我将它们单独列出)
如果要处理异常(由when子字符串处理),那么异常必须有一个名称,例如TOO_MANY_ROWS;
有数千个数据库错误,但不到 25 个是内置命名异常(这些异常在标准包中声明);
要处理未命名的异常,您可以将名称与错误号相关联。实现这一点的语句是 pragma exception_init 语句;
抛出异常:
一个。通过pl/sql运行引擎
当数据库或PL/SQL在运行时发生错误时,PL/SQL运行时引擎会自动抛出异常。
b.使用 raise 语句
也可以通过raise语句抛出异常:raise exception_name;
c.调用 raise_application_error 存储过程
异常处理和异常传播:
一个。程序一旦进入异常部分,就无法返回到同一块的执行部分;当异常处理完毕后,控制权返回到外层执行部分的下一条语句;
b.如果有when other子串,则必须将其放在末尾作为默认处理器,以处理未显式处理的异常;
c.执行部分抛出的异常会首先传递给同一个块的异常部分。如果同一块的异常部分没有处理器来处理该异常,则该异常将向上层的异常部分传播,直到结束。外层;
d.异常处理完后,如果还想让它继续传播,可以在异常处理结束时执行不带参数的raise语句(raise语句会重新抛出已经发生的异常,让其继续传播);
–这是上面一些知识点的示例(伪代码)解释
宣布
…
user_define_exception异常; –用户自定义异常
invalid_column_name 异常;
–补充说明:如果我们在程序块中使用了无效的列名,括号中将会出现错误信息(ORA-00904:无效的列名)
–接下来我们把这个异常代码号和我们自定义的异常关联起来,也就是给异常命名。
pragma exception_init(invalid_column_name,-904);
开始
…
–引发用户定义异常; — 可以显式引发异常
例外
when TOO_MANY_ROWS then –预定义的异常处理
…;
when user_define_exception then –用户定义的异常处理
…;
when invalid_column_name then –PRAGMA EXCEPTION_INIT 异常处理
…;
增加; –继续传播异常
结尾;
sqlcode 和 sqlerrm:
一个。处理数据库错误的另一种方法是使用内置函数sqlcode和sqlerrm;
b. sqlcode 将返回当前数据库错误号。这些错误号中,除了no_data_found为+100外,其余均为负数;
c. sqlerrm 返回文本中描述的错误消息;
d.为了获取用户自定义异常返回的sqlerrm和sqlcode,您需要使用raise_application_error函数为自定义异常标记错误号。
数量自定义错误:
一个。 raise_application_error内置函数用于抛出异常,并为异常分配错误号和错误消息;
b.自定义异常默认错误号为+1,默认信息为user_define_exception。来自未处理异常的一般信息对于识别导致错误的原因没有帮助,
c.可以在pl/sql程序块的执行部分和异常部分调用raise_application_error函数来显式抛出带有特殊错误号的命名异常;
d.使用语法:raise_application_error(error_no,error_message[,{true|| false}]);
e.错误编号范围为-20,001至-20,999;错误消息是一个文本字符串oracle存储过程异常处理,最多 2048 字节; true 和 false 表示是否添加(true)到错误堆栈(error stack)或覆盖(overwrite)错误堆栈(false)。默认为 false。
暂无评论内容