他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

43.4. 式

PL/pgSQL文で使用される式は全て、サーバの主SQLエクゼキュータを使用して処理されます。 例えば、以下のPL/pgSQL

IF expression THEN ...

が記述された時、PL/pgSQL

SELECT expression

を主SQLエンジンに供給して、上式を評価します。 43.11.1において詳細を説明したように、SELECTコマンドの形成においてPL/pgSQL変数名は、その都度問い合わせパラメータによって置換されます。 これにより、SELECTの問い合わせ計画は一度だけ準備することができ、その後の評価で異なった変数値を代入して再利用されます。 すなわち、式の最初の使用においては、実質的にPREPAREコマンドと同等です。 例えば、2つの整数変数xyを宣言して、

IF x < y THEN ...

という条件式を記述すると背後では

PREPARE statement_name(integer, integer) AS SELECT $1 < $2;

と同等なプリペアドステートメントが作成されます。 そしてIF文を実行する度にPL/pgSQLの最新の変数値をパラメータ値として供給して、このプリペアドステートメントに対してEXECUTEを行います。 通常この詳細は、PL/pgSQLユーザにとって重要ではありませんが、この知識は問題点の解析に有用です。 それ以外の情報は、43.11.2に記述されています。

expressionSELECTコマンドに変換されますので、通常のSELECTが含むことのできるものと同じ句を含むことができます。ただし、トップレベルのUNIONINTERSECTEXCEPT句は含むことができません。 そのため、例えば、以下によりテーブルが空でないか確かめることができます。

IF count(*) > 0 FROM my_table THEN ...

IFTHEN間のSELECT count(*) > 0 FROM my_tableであるかのように解析されるからです。 SELECTは1つの列、2つ以上でない行を生成しなければなりません。 (行を生成しないのであれば、結果はNULLとして受け付けられます。)