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