| PostgreSQL 7.4 文檔 | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 37. PL/pgSQL - SQL 過程語言 | Fast Forward | Next |
利用RAISE語句報告信息以及拋出錯誤。
RAISE level 'format' [, variable [, ...]];可能的級別有DEBUG(向服務器日志寫信息), LOG(向服務器日志寫信息,優先級更高), INFO, NOTICE和WARNING(把信息寫到 服務器日志以及轉發到客戶端應用,優先級逐步升高)和 EXCEPTION(拋出一個錯誤, 退出當前事務). 某個優先級別的信息是報告給客戶端還是寫到服務器日志, 還是兩個都做是由 log_min_messages 和 client_min_messages 配置變量控制的。 參閱 Section 16.4 獲取更多細節。
在格式字串裡,% 被下一個可選參數的外部表現形式代替。 要發出一個文本的 %,你要寫 %%。 請注意可選的參數必須是簡單的變量,不能是表達式,而且格式必須是一個簡單的字串文本。
在這個例子裡,v_job_id的值將代替字串中的%:
RAISE NOTICE ''Calling cs_create_job(%)'',v_job_id;
這個例子將會帶著給出的錯誤信息退出事務:
RAISE EXCEPTION ''Inexistent ID --> %'',user_id;
PostgreSQL 現在還沒有足夠聰明的例外處理模型。 不管是分析器,規劃器/優化器還是執行器認為一條語句無法再處理下去了, 那麼整個事務都退出,然後系統跳回主循環等待來自客戶端應用的下一條命令。
我們可以'鉤'在錯誤處理機制上來提示這種情況的發生。 但是目前我們沒有能力告訴(用戶)是什麼導致了退出(輸入/輸出轉換錯誤, 浮點數錯誤,分析錯誤等)。並且此時的數據庫服務器可能處在一種不連貫的狀態, 所以退回到上層執行器或執行更多的命令可能摧毀整個數據庫。
因此,PL/pgSQL 在函數或觸發器操作時遇到退出的唯一一項操作是寫一些額外的NOTICE級別的日志信息, 報告在哪個函數和在那裡(行號和語句類型)出了錯。 這些錯誤總是中止該函數的執行。