處理 oracle 系統(tǒng)自動生成系統(tǒng)異常外,可以使用 raise 來手動生成錯誤。
l Raise exception;
l Raise package.exception;
l Raise;
以上是 raise 的三種使用方法。第一種用于生成當(dāng)前程序中定義的異?;蛟?/span> standard 中的系統(tǒng)異常。
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;
這是一個生成自定義異常的例子,當(dāng)然也可以生成系統(tǒng)異常:
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;
有一些異常是定義在非標(biāo)準(zhǔn)包中的,如 UTL_FILE , DBMS_SQL 以及程序員創(chuàng)建的包中異常??梢允褂?/span> raise 的第二種用法來生成異常。
If day_overdue(isbn_in, browser_in) > 365
Then
Raise overdue_pkg.book_is_lost
End if;
在最后一種 raise 的形式中,不帶任何參數(shù)。這種情況只出現(xiàn)在希望將當(dāng)前的異常傳到外部程序時。
Exception
When no_data_found
Then
Raise;
End;
Pl.sql 使用 raise_application_error 過程來生成一個有具體描述的異常。當(dāng)使用這個過程時,當(dāng)前程序被中止,輸入輸出參數(shù)被置為原先的值,但任何 DML 對數(shù)據(jù)庫所做的改動將被保留,可以在之后用 rollback 命令回滾。下面是該過程的原型:
Procedure raise_application_error(
Num binary_integer;
Msg varchar2;
Keeperrorstack Boolean default false
)
其中 num 是在 -20999 到 -20000 之間的任何數(shù)字(但事實上, DBMS_OUPUT 和 DBMS_DESCRIBLE 包使用了 -20005 到 -20000 的數(shù)字); msg 是小于 2K 個字符的描述語,任何大于 2K 的字符都將被自動丟棄; keeperrorstack 默認(rèn)為 false ,是指清空異常棧,再將當(dāng)前異常入棧,如果指定 true 的話就直接將當(dāng)前異常壓入棧中。
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;