PL/Tcl 函數內或從中呼叫的 Tcl 程式碼可能會引發錯誤,無論是透過執行某些無效的操作,還是使用 Tcl error
命令或 PL/Tcl 的 elog
命令來產生錯誤。 可以使用 Tcl catch
命令在 Tcl 中捕獲這些錯誤。 如果未捕獲錯誤,而是允許其傳播到 PL/Tcl 函數執行的最上層,則會將其回報為函數呼叫查詢中的 SQL 錯誤。
相反地,PL/Tcl 的 spi_exec
、spi_prepare
和 spi_execp
命令中發生的 SQL 錯誤會回報為 Tcl 錯誤,因此它們可以被 Tcl 的 catch
命令捕獲。(這些 PL/Tcl 命令中的每一個都在子交易中執行其 SQL 操作,該子交易會在發生錯誤時回滾,因此任何部分完成的操作都會自動清除。)同樣地,如果錯誤在未被捕獲的情況下傳播到最上層,它會變回 SQL 錯誤。
Tcl 提供一個 errorCode
變數,該變數可以用一種 Tcl 程式易於解釋的形式來表示有關錯誤的其他資訊。 內容採用 Tcl 清單格式,第一個字會識別回報錯誤的子系統或程式庫;除此之外,內容由個別子系統或程式庫決定。 對於 PL/Tcl 命令回報的資料庫錯誤,第一個字是 POSTGRES
,第二個字是 PostgreSQL 版本號碼,其他字是欄位名稱/值配對,提供有關錯誤的詳細資訊。 始終提供欄位 SQLSTATE
、condition
和 message
(前兩個欄位表示錯誤代碼和條件名稱,如 附錄 A 中所示)。 可能存在的欄位包括 detail
、hint
、context
、schema
、table
、column
、datatype
、constraint
、statement
、cursor_position
、filename
、lineno
和 funcname
。
使用 PL/Tcl 的 errorCode
資訊的一種方便方法是將其載入到陣列中,以便欄位名稱成為陣列下標。 執行此操作的程式碼可能如下所示
if {[catch { spi_exec $sql_command }]} { if {[lindex $::errorCode 0] == "POSTGRES"} { array set errorArray $::errorCode if {$errorArray(condition) == "undefined_table"} { # deal with missing table } else { # deal with some other type of SQL error } } }
(雙冒號明確指定 errorCode
是一個全域變數。)
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來回報文件問題。