使用 RAISE
語句報告訊息和引發錯誤。
RAISE [level
] 'format
' [,expression
[, ... ]] [ USINGoption
{ = | := }expression
[, ... ] ]; RAISE [level
]condition_name
[ USINGoption
{ = | := }expression
[, ... ] ]; RAISE [level
] SQLSTATE 'sqlstate
' [ USINGoption
{ = | := }expression
[, ... ] ]; RAISE [level
] USINGoption
{ = | := }expression
[, ... ]; RAISE ;
level
選項指定錯誤嚴重級別。允許的級別有 DEBUG
、LOG
、INFO
、NOTICE
、WARNING
和 EXCEPTION
,其中 EXCEPTION
是預設值。 EXCEPTION
會引發一個錯誤(通常會中止當前事務);其他級別僅生成不同優先順序級別的訊息。特定優先順序的訊息是否報告給客戶端、寫入伺服器日誌或兩者都有,由 log_min_messages 和 client_min_messages 配置變數控制。更多資訊請參見 第 19 章。
在第一種語法變體中,如果 level
存在,後面跟著一個 format
字串(必須是簡單的字串字面量,而不是表示式)。格式字串指定要報告的錯誤訊息文字。格式字串後面可以跟可選的引數表示式,用於插入到訊息中。在格式字串內部,%
被替換為下一個可選引數的值的字串表示形式。要輸出字面量 %
,請寫 %%
。引數的數量必須與格式字串中的 %
佔位符數量匹配,否則會在函式編譯期間引發錯誤。
在此示例中,v_job_id
的值將替換字串中的 %
。
RAISE NOTICE 'Calling cs_create_job(%)', v_job_id;
在第二種和第三種語法變體中,condition_name
和 sqlstate
分別指定一個錯誤條件名稱或一個五字元的 SQLSTATE 程式碼。請參見 附錄 A 瞭解有效的錯誤條件名稱和預定義的 SQLSTATE 程式碼。
以下是 condition_name
和 sqlstate
用法的示例:
RAISE division_by_zero; RAISE WARNING SQLSTATE '22012';
在任何這些語法變體中,您都可以透過寫入 USING
加上 option
= expression
條目來附加額外資訊到錯誤報告。每個 expression
可以是任何字串值的表示式。允許的 option
關鍵字是:
此示例將以給定的錯誤訊息和提示中止事務。
RAISE EXCEPTION 'Nonexistent ID --> %', user_id USING HINT = 'Please check your user ID';
這兩個示例展示了設定 SQLSTATE 的等效方法。
RAISE 'Duplicate user ID: %', user_id USING ERRCODE = 'unique_violation'; RAISE 'Duplicate user ID: %', user_id USING ERRCODE = '23505';
另一種產生相同結果的方法是:
RAISE unique_violation USING MESSAGE = 'Duplicate user ID: ' || user_id;
如第四種語法變體所示,也可以寫 RAISE USING
或 RAISE
,並將其他所有內容放入 level
USINGUSING
列表中。
RAISE
的最後一種變體沒有任何引數。此形式只能在 BEGIN
塊的 EXCEPTION
子句內使用;它會導致當前正在處理的錯誤被重新引發。
在 PostgreSQL 9.1 之前,不帶引數的 RAISE
被解釋為重新引發來自包含活動異常處理程式的塊的錯誤。因此,即使 RAISE
在巢狀的 EXCEPTION
子句的塊內,巢狀在該處理程式內的 EXCEPTION
子句也無法捕獲它。這被認為令人驚訝,並且與 Oracle 的 PL/SQL 不相容。
如果在 RAISE EXCEPTION
命令中沒有指定條件名稱或 SQLSTATE,則預設使用 raise_exception
(P0001
)。如果未指定訊息文字,則預設使用條件名稱或 SQLSTATE 作為訊息文字。
當透過 SQLSTATE 程式碼指定錯誤程式碼時,您不限於預定義的錯誤程式碼,但可以選擇任何由五個數字和/或大寫 ASCII 字母組成的錯誤程式碼,除了 00000
。建議您避免引發以三個零結尾的錯誤程式碼,因為這些是類別程式碼,只能透過捕獲整個類別來捕獲。
ASSERT
語句是方便地將除錯檢查插入 PL/pgSQL 函式的一種快捷方式。
ASSERTcondition
[ ,message
];
condition
是一個布林表示式,預期它總是會計算為 true;如果為 true,則 ASSERT
語句不做任何其他操作。如果結果為 false 或 null,則會引發 ASSERT_FAILURE
異常。(如果在評估 condition
時發生錯誤,它將作為一個正常錯誤報告。)
如果提供了可選的 message
,它是一個表示式,其結果(如果不是 null)將替換預設錯誤訊息文字“assertion failed”,以防 condition
失敗。在斷言成功(正常情況)時,message
表示式不會被評估。
斷言的測試可以透過配置引數 plpgsql.check_asserts
來啟用或停用,該引數接受一個布林值;預設值為 on
。如果此引數為 off
,則 ASSERT
語句不執行任何操作。
請注意,ASSERT
用於檢測程式錯誤,而不是報告普通錯誤條件。對於這種情況,請使用上面描述的 RAISE
語句。
如果您在文件中看到任何不正確、與您使用特定功能時的體驗不符或需要進一步說明的內容,請使用 此表單 報告文件問題。