所有在 PL/pgSQL 語句中使用的表達式都使用伺服器的主要SQL執行器來處理。例如,當您編寫像這樣的 PL/pgSQL 語句時
IF expression
THEN ...
PL/pgSQL 將透過提供像這樣的查詢來評估表達式
SELECT expression
到主 SQL 引擎。在形成 SELECT
命令時,任何出現的 PL/pgSQL 變數名稱都會被查詢參數取代,如第 41.11.1 節中所詳述。這允許 SELECT
的查詢計畫僅準備一次,然後重複用於後續的變數不同值的評估。因此,第一次使用表達式時,實際發生的事情本質上是一個 PREPARE
命令。例如,如果我們宣告了兩個整數變數 x
和 y
,並且我們寫了
IF x < y THEN ...
幕後發生的事情相當於
PREPARE statement_name
(integer, integer) AS SELECT $1 < $2;
然後對於每次執行 IF
語句,這個預備語句都會被 EXECUTE
,並將 PL/pgSQL 變數的當前值作為參數值提供。通常這些細節對於 PL/pgSQL 使用者來說並不重要,但在嘗試診斷問題時了解它們很有用。更多資訊請參閱第 41.11.2 節。
由於 expression
被轉換為 SELECT
命令,它可以包含與普通 SELECT
相同的子句,但它不能包含頂層的 UNION
、INTERSECT
或 EXCEPT
子句。因此,例如,可以測試一個表是否為非空,如下所示:
IF count(*) > 0 FROM my_table THEN ...
因為 IF
和 THEN
之間的 expression
被解析為好像它是 SELECT count(*) > 0 FROM my_table
。SELECT
必須產生單個欄位,且不能超過一行。(如果它沒有產生任何行,則結果被視為 NULL。)
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來報告文件問題。