-2
任何人都可以解釋爲什麼我們需要編譯指示異常初始化。我們有用戶定義的異常,它與pragma執行相同的工作。您的答覆將不勝感激。什麼情況我們可以去pragma_exception_init
任何人都可以解釋爲什麼我們需要編譯指示異常初始化。我們有用戶定義的異常,它與pragma執行相同的工作。您的答覆將不勝感激。什麼情況我們可以去pragma_exception_init
pragma exception_init用於爲異常提供名稱,以便您可以在異常處理程序中通過該名稱引用異常。幾千個Oracle例外中只有少數具有預定義的名稱。您可以使用exception_init爲這些其他例外創建名稱。
看到https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/errors.htm#BABGIIBI
我編輯我以前的答案,因爲在這裏我可以插入格式化文本。 在你的例子中,你正在定義一個你正在拋出的異常,但是如果你想要捕獲系統正在拋出但是未命名的現有異常呢?在下面的例子中,我處理了兩個特定的錯誤「DATA_NOT_FOUND」和ORA-600,這是一個系統錯誤(是的,我有一些代碼可以獲取這些錯誤)。
CREATE OR REPLACE PROCEDURE exception_init_demo
AS
l_routine VARCHAR2 (30) := $$plsql_unit;
severe_system_error EXCEPTION;
PRAGMA EXCEPTION_INIT (severe_system_error, -600);
BEGIN
-- Execution code goes here
NULL;
EXCEPTION
WHEN severe_system_error
THEN
-- Severe error, log it, notify the dba, re-raise the exception
log_error (
p_application => $$plsql_unit
, p_routine => l_routine
, p_message => SQLERRM || UTL_TCP.crlf || DBMS_UTILITY.format_error_backtrace()
);
notify_dba;
RAISE;
WHEN NO_DATA_FOUND
THEN
-- No data was found, this is OK, ignore error and return
return;
WHEN OTHERS
THEN
-- all other errors we will log and re-raise
log_error (
p_application => $$plsql_unit
, p_routine => l_routine
, p_message => SQLERRM || UTL_TCP.crlf || DBMS_UTILITY.format_error_backtrace()
);
RAISE;
END;
用於離:創建或替換過程proc_pragma_demo 作爲 i個:= 1; i_greater_than_zero異常; pragma exception_init(i_greater_than_zero,-1234); begin if(i> 0)then raise i_greater_than_zero; end if; 異常 當i_greater_than_zero然後 dbms_output.put_line('我值大於零:'); 結束;在上面的例子中,即使我們沒有編譯指令,它也會執行相同的工作。編譯指示的意義是什麼? –
非常感謝Brian。我明白了。 –