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