2017-02-13 70 views
0

我是Postgresql的新手,所以我不想爲一些基本任務創建我自己的結構體......
我的任務是創建函數並拋出異常(RAISE EXCEPTION 'test')條件讓客戶抓住它或在沒有正確處理的情況下重新拋出。問題是,在拋出之前,我想將異常LOG記錄到數據庫中的特殊表中,但意識到拋出錯誤是回滾之前做出的更改!有什麼方法可以改變這種行爲,或者我可以做的所有事情 - 添加一些CODE輸出參數,並基於該CODE在客戶端上拋出錯誤?我現在使用的示例代碼:在postgresql函數中拋出異常

CREATE OR REPLACE FUNCTION fn_...() 
... 
BEGIN 
    IF nretry_count >= nmax_retry 
    THEN 
     INSERT INTO log VALUES (error_type, value) VALUES (1,'Max retry exceeded!'); 
     RAISE EXCEPTION 'Max retry count exceeded'; 
    END IF; 
END 
$$ LANGUAGE plpgsql; 
+0

也許你可以在插入之前使用某種觸發器。在觸發函數中,您可以引發異常並將數據記錄到另一個表中。 https://www.postgresql.org/docs/9.6/static/plpgsql-trigger.html –

+0

@BenH不在這種情況下:觸發器可以設置一些表的動作。在我的情況下,我沒有表格操作,只是一些條件,與任何表格都沒有直接關係。 – 0x49D1

回答

3

你可以啓動一個事務,並設置應用程序中的SAVEPOINT。然後,在發現異常後,您可以創建日誌條目和COMMIT

有沒有辦法從一個函數執行不回滾數據修改內部拋出一個異常,因爲沒有「自治事務中的PostgreSQL 」。

+0

好的,明白了:所以在某些情況下,我不能使用函數來創建一些有例外的動作鏈。必須從客戶那裏做。 – 0x49D1