2016-12-05 53 views

回答

0

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; 
+0

用於離:創建或替換過程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('我值大於零:'); 結束;在上面的例子中,即使我們沒有編譯指令,它也會執行相同的工作。編譯指示的意義是什麼? –

+0

非常感謝Brian。我明白了。 –

相關問題