All expressions used in <application>PL/pgSQL</application> statements are processed using the server's main <acronym>SQL</acronym> executor. For example, when you write a <application>PL/pgSQL</application> statement like PL/pgSQL文で使用される式は全て、サーバの主SQLエグゼキュータを使用して処理されます。 例えば、以下のPL/pgSQL文
IF expression
THEN ...
<application>PL/pgSQL</application> will evaluate the expression by feeding a query like が記述された時、PL/pgSQLは
SELECT expression
to the main SQL engine. While forming the <command>SELECT</command> command,
any occurrences of <application>PL/pgSQL</application> variable names
are replaced by query parameters, as discussed in detail in
<xref linkend="plpgsql-var-subst"/>.
This allows the query plan for the <command>SELECT</command> to
be prepared just once and then reused for subsequent
evaluations with different values of the variables. Thus, what
really happens on first use of an expression is essentially a
<command>PREPARE</command> command. For example, if we have declared
two integer variables <literal>x</literal> and <literal>y</literal>, and we write
を主SQLエンジンに供給して、上式を評価します。
41.11.1において詳細を説明したように、SELECT
コマンドの形成においてPL/pgSQL変数名は、その都度問い合わせパラメータによって置換されます。
これにより、SELECT
の問い合わせ計画は一度だけ準備することができ、その後の評価で異なった変数値を代入して再利用されます。
すなわち、式の最初の使用においては、実質的にPREPARE
コマンドと同等です。
例えば、2つの整数変数x
とy
を宣言して、
IF x < y THEN ...
what happens behind the scenes is equivalent to という条件式を記述すると背後では
PREPARE statement_name
(integer, integer) AS SELECT $1 < $2;
and then this prepared statement is <command>EXECUTE</command>d for each
execution of the <command>IF</command> statement, with the current values
of the <application>PL/pgSQL</application> variables supplied as
parameter values. Normally these details are
not important to a <application>PL/pgSQL</application> user, but
they are useful to know when trying to diagnose a problem.
More information appears in <xref linkend="plpgsql-plan-caching"/>.
と同等なプリペアドステートメントが作成されます。
そしてIF
文を実行する度にPL/pgSQLの最新の変数値をパラメータ値として供給して、このプリペアドステートメントに対してEXECUTE
を行います。
通常この詳細は、PL/pgSQLユーザにとって重要ではありませんが、この知識は問題点の解析に有用です。
それ以外の情報は、41.11.2に記述されています。
Since an <replaceable>expression</replaceable> is converted to a
<literal>SELECT</literal> command, it can contain the same clauses
that an ordinary <literal>SELECT</literal> would, except that it
cannot include a top-level <literal>UNION</literal>,
<literal>INTERSECT</literal>, or <literal>EXCEPT</literal> clause.
Thus for example one could test whether a table is non-empty with
expression
はSELECT
コマンドに変換されますので、通常のSELECT
が含むことのできるものと同じ句を含むことができます。ただし、トップレベルのUNION
、INTERSECT
、EXCEPT
句は含むことができません。
そのため、例えば、以下によりテーブルが空でないか確かめることができます。
IF count(*) > 0 FROM my_table THEN ...
since the <replaceable>expression</replaceable>
between <literal>IF</literal> and <literal>THEN</literal> is parsed as
though it were <literal>SELECT count(*) > 0 FROM my_table</literal>.
The <literal>SELECT</literal> must produce a single column, and not
more than one row. (If it produces no rows, the result is taken as
NULL.)
IF
とTHEN
間の式
はSELECT count(*) > 0 FROM my_table
であるかのように解析されるからです。
SELECT
は1つの列、2つ以上でない行を生成しなければなりません。
(行を生成しないのであれば、結果はNULLとして受け付けられます。)