2014-11-06 160 views
1

也許一個愚蠢的問題,而是說我有像這樣(大大簡化爲簡潔起見)一個記錄程序:數據庫日誌記錄在日誌記錄過程

PROCEDURE LOGGER (
    p_TYPEOFLOG    IN VARCHAR2, 
    p_LOGSEVERITY   IN VARCHAR2, 
    p_SESSIONID    IN VARCHAR2) 
AS 
    v_timestamp    DATE := SYSDATE; 

BEGIN 

    PRAGMA autonomous_transaction; 

    BEGIN 
     INSERT INTO Log (
      TypeOfLog, LogSeverity, SessionID, TimeOfAction) 
     VALUES (
      p_TYPEOFLOG, p_LOGSEVERITY, p_SESSIONID, v_timestamp); 
     COMMIT; 
    END; 

END LOGGER; 

現在,通常我會換行開始/結束位了一個異常處理程序,它將調用此記錄程序。但是如果我已經在記錄儀中,我該怎麼辦?如果其他人爲空並跳過它,我是否僅僅執行異常?我是否嘗試再次調用記錄程序?這裏的標準是什麼?

+0

如果您再次調用Logger過程,並再次失敗 - 如果它是一個更廣泛的問題,如空間用完,請說 - 如何防止無限遞歸添加到您的問題? Oracle可能會試圖終止遞歸,但是你也會嘗試記錄它... – 2014-11-06 16:28:59

回答

4

我不認爲有「標準」這樣的東西。個人而言,如果我的日誌代碼失敗,我會讓任何生成的異常被拋出並傳播到堆棧中。如果你不能寫Log表,那意味着發生了非常不幸的事情。我不想趕上並忽略這種例外。如果沒有其他記錄錯誤的方法,我會將異常提交給調用者,並期望調用者將消息顯示給用戶(即前端Web應用程序中的堆棧跟蹤)或將消息記錄到應用程序服務器日誌。

+0

[我的PL/SQL日誌記錄工具在這裏](https://github.com/peihanw/plsql_runlog)。希望能有所幫助。 – peihan 2016-01-18 02:49:03