捕捉錯誤 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

捕捉錯誤

當存儲過程中發生錯誤時,不會運行其他代碼,並回滾事務。不過,您可以使用 EXCEPTION 區塊來處理錯誤。

[ <<label>> ] [ DECLARE declarations ] BEGIN statements EXCEPTION WHEN OTHERS THEN statements END;

當發生異常並添加異常處理塊時,您可以編寫 GATE 語句和大多數其他 PL/PGSQL 語句。例如,您可以使用自定義消息引發異常,或將記錄插入日誌記錄表。

當進入異常處理塊時,將回滾當前事務,並創建一個新的事務來運行該塊中的語句。如果塊中的語句運行沒有錯誤,則會提交事務並重新引發異常。最後,存儲過程退出。

例外狀況區塊中唯一支援的條件是 OTHERS,它會匹配各種錯誤類型 (查詢取消除外)。另外,如果在例外狀況處理區塊中發生錯誤,它可由外層例外狀況處理區塊捕捉。

範例

以下範例示範如何在例外狀況處理區塊中寫入陳述式。

CREATE TABLE employee (firstname varchar, lastname varchar); INSERT INTO employee VALUES ('Tomas','Smith'); CREATE TABLE employee_error_log (message varchar); CREATE OR REPLACE PROCEDURE update_employee_sp() AS $$ BEGIN UPDATE employee SET firstname = 'Adam' WHERE lastname = 'Smith'; EXECUTE 'select invalid'; EXCEPTION WHEN OTHERS THEN RAISE INFO 'An exception occurred.'; INSERT INTO employee_error_log VALUES ('Error message: ' || SQLERRM); END; $$ LANGUAGE plpgsql; CALL update_employee_sp(); INFO: An exception occurred. ERROR: column "invalid" does not exist CONTEXT: SQL statement "select invalid" PL/pgSQL function "update_employee_sp" line 3 at execute statement

在此範例中,如果我們呼叫update_employee_sp,信息性消息發生異常。,並將錯誤消息插入到日誌表的employee_error_log日誌。在存儲過程退出之前,將再次拋出原始異常。以下查詢顯示運行示例所產生的記錄。

SELECT * from employee; firstname | lastname -----------+---------- Tomas | Smith SELECT * from employee_error_log; message ------------------------------------------------ Error message: column "invalid" does not exist