原文地址:http://hi.baidu.com/dz05011/blog/item/aace03c29c9f4f3de4dd3bc0.html
1、异常的优点 Oracle:pl/sql异常处理 (3)处理 oracle 系统自动生成系统异常外,可以使用 raise 来手动生成错误。 l Raise exception; l Raise package.exception; l Raise; 以上是 raise 的三种使用方法。第一种用于生成当前程序中定义的异常或在 standard 中的系统异常。 Declare Invalid_id exception; Id_values varchar(2); Begin Id_value:=id_for(‘smith’); If substr(id_value,1,1)!=’x’ Then Raise invalid_id; End if; Exception When invalid_id Then Dbms_output.put_line(‘this is an invalid id!’); End; 这是一个生成自定义异常的例子,当然也可以生成系统异常: declare employee_id_in number; Begin Select employee_id into employee_id_in from employ_list where employee_name=&n; If employee_id_in=0 Then Raise zero_devided; End if; Exception When zero_devided Then Dbms_output.put_line(‘wrong!’); End; 有一些异常是定义在非标准包中的,如 UTL_FILE , DBMS_SQL 以及程序员创建的包中异常。可以使用 raise 的第二种用法来生成异常。 If day_overdue(isbn_in, browser_in) > 365 Then Raise overdue_pkg.book_is_lost End if; 在最后一种 raise 的形式中,不带任何参数。这种情况只出现在希望将当前的异常传到外部程序时。 Exception When no_data_found Then Raise; End;
Pl.sql 使用 raise_application_error 过程来生成一个有具体描述的异常。当使用这个过程时,当前程序被中止,输入输出参数被置为原先的值,但任何 DML 对数据库所做的改动将被保留,可以在之后用 rollback 命令回滚。下面是该过程的原型: Procedure raise_application_error( Num binary_integer; Msg varchar2; Keeperrorstack Boolean default false ) 其中 num 是在 -20999 到 -20000 之间的任何数字(但事实上, DBMS_OUPUT 和 DBMS_DESCRIBLE 包使用了 -20005 到 -20000 的数字); msg 是小于 2K 个字符的描述语,任何大于 2K 的字符都将被自动丢弃; keeperrorstack 默认为 false ,是指清空异常栈,再将当前异常入栈,如果指定 true 的话就直接将当前异常压入栈中。 CREATE OR REPLACE PROCEDURE raise_by_language (code_in IN PLS_INTEGER) IS l_message error_table.error_string%TYPE; BEGIN SELECT error_string INTO l_message FROM error_table, v$nls_parameters v WHERE error_number = code_in AND string_language = v.VALUE AND v.parameter = 'NLS_LANGUAGE';
RAISE_APPLICATION_ERROR (code_in, l_message); END; |