PL/pgSQL文で使用される式は全て、サーバの主SQLエグゼキュータを使用して処理されます。 例えば、以下のPL/pgSQL文
IF expression
THEN ...
が記述された時、PL/pgSQLは
SELECT expression
を主SQLエンジンに供給して、上式を評価します。
43.11.1において詳細を説明したように、SELECT
コマンドの形成においてPL/pgSQL変数名は、その都度問い合わせパラメータによって置換されます。
これにより、SELECT
の問い合わせ計画は一度だけ準備することができ、その後の評価で異なった変数値を代入して再利用されます。
すなわち、式の最初の使用においては、実質的にPREPARE
コマンドと同等です。
例えば、2つの整数変数x
とy
を宣言して、
IF x < y THEN ...
という条件式を記述すると背後では
PREPARE statement_name
(integer, integer) AS SELECT $1 < $2;
と同等なプリペアドステートメントが作成されます。
そしてIF
文を実行する度にPL/pgSQLの最新の変数値をパラメータ値として供給して、このプリペアドステートメントに対してEXECUTE
を行います。
通常この詳細は、PL/pgSQLユーザにとって重要ではありませんが、この知識は問題点の解析に有用です。
それ以外の情報は、43.11.2に記述されています。
expression
はSELECT
コマンドに変換されますので、通常のSELECT
が含むことのできるものと同じ句を含むことができます。ただし、トップレベルのUNION
、INTERSECT
、EXCEPT
句は含むことができません。
そのため、例えば、以下によりテーブルが空でないか確かめることができます。
IF count(*) > 0 FROM my_table THEN ...
IF
とTHEN
間の式
はSELECT count(*) > 0 FROM my_table
であるかのように解析されるからです。
SELECT
は1つの列、2つ以上でない行を生成しなければなりません。
(行を生成しないのであれば、結果はNULLとして受け付けられます。)