处理
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;