Functions written in <application>PL/pgSQL</application> are defined to the server by executing <xref linkend="sql-createfunction"/> commands. Such a command would normally look like, say, PL/pgSQLで書かれた関数はCREATE FUNCTIONコマンドを実行することでサーバに定義されます。 そのようなコマンドは通常、例えば次のようになります。
CREATE FUNCTION somefunc(integer, text) RETURNS integer
AS 'function body text
'
LANGUAGE plpgsql;
The function body is simply a string literal so far as <command>CREATE
FUNCTION</command> is concerned. It is often helpful to use dollar quoting
(see <xref linkend="sql-syntax-dollar-quoting"/>) to write the function
body, rather than the normal single quote syntax. Without dollar quoting,
any single quotes or backslashes in the function body must be escaped by
doubling them. Almost all the examples in this chapter use dollar-quoted
literals for their function bodies.
関数本体はCREATE FUNCTION
にとっては単なる文字列リテラルです。
関数本体を書くのには、普通の単一引用符構文よりは、ドル引用符(4.1.2.4を参照)を使うのが、多くの場合役に立ちます。
ドル引用符でなければ、関数本体内の単一引用符やバックスラッシュをすべて二重化してエスケープしなければなりません。
この章のほぼすべての例では、関数本体にドル記号で括られたリテラルを使っています。
<application>PL/pgSQL</application> is a block-structured language. The complete text of a function body must be a <firstterm>block</firstterm>. A block is defined as: PL/pgSQLはブロック構造の言語です。 関数本体のテキスト全体はブロックでなければなりません。 ブロックは以下のように定義されます。
[ <<label
>> ] [ DECLAREdeclarations
] BEGINstatements
END [label
];
Each declaration and each statement within a block is terminated
by a semicolon. A block that appears within another block must
have a semicolon after <literal>END</literal>, as shown above;
however the final <literal>END</literal> that
concludes a function body does not require a semicolon.
ブロック内の宣言や文はそれぞれ、セミコロンで終わります。
上に示したように、他のブロック内に出現するブロックのEND
の後にはセミコロンが必要ですが、関数本体を完結する最後のEND
には不要です。
A common mistake is to write a semicolon immediately after
<literal>BEGIN</literal>. This is incorrect and will result in a syntax error.
BEGIN
の直後にセミコロンを書くことも、同じように間違いです。
これは不正であり、構文エラーとなります。
A <replaceable>label</replaceable> is only needed if you want to
identify the block for use
in an <literal>EXIT</literal> statement, or to qualify the names of the
variables declared in the block. If a label is given after
<literal>END</literal>, it must match the label at the block's beginning.
label
が必要となるのは、EXIT
文が使用されるブロックを特定したい場合、またはブロック内で宣言された変数名を修飾したい場合だけです。
END
の後にラベルを配置する時は、そのブロックの先頭ラベルと一致させなければなりません。
All key words are case-insensitive. Identifiers are implicitly converted to lower case unless double-quoted, just as they are in ordinary SQL commands. 全てのキーワードは大文字と小文字を区別しません。 識別子は二重引用符でくくられていない限り、通常のSQLコマンドと同様に、暗黙的に小文字に変換されます。
Comments work the same way in <application>PL/pgSQL</application> code as in
ordinary SQL. A double dash (<literal>--</literal>) starts a comment
that extends to the end of the line. A <literal>/*</literal> starts a
block comment that extends to the matching occurrence of
<literal>*/</literal>. Block comments nest.
PL/pgSQLコード内では、通常のSQLと同じ方法のコメントが動作します。
二重のダッシュ(--
)はその行末までをコメントとするコメントを開始します。
/*
はコメントブロックの始まりを意味し、次に*/
が現れるまでをコメントとします。
ブロックコメントは入れ子になります。
Any statement in the statement section of a block can be a <firstterm>subblock</firstterm>. Subblocks can be used for logical grouping or to localize variables to a small group of statements. Variables declared in a subblock mask any similarly-named variables of outer blocks for the duration of the subblock; but you can access the outer variables anyway if you qualify their names with their block's label. For example: ブロックの文節内の全ての文は副ブロックになることができます。 副ブロックは論理的なグループ分けや変数を文の小さな集まりに局所化するのに使用できます。 副ブロックにおいて宣言された変数は、副ブロック内部では外側のブロックにおける同名の変数を遮蔽しますが、外側のラベルを変数名に付加して指定すればアクセスできます。 以下に例を示します。
CREATE FUNCTION somefunc() RETURNS integer AS $$ << outerblock >> DECLARE quantity integer := 30; BEGIN RAISE NOTICE 'Quantity here is %', quantity; -- Prints 30 RAISE NOTICE 'Quantity here is %', quantity; -- Quantity here is 30と表示 quantity := 50; -- -- Create a subblock -- 副ブロックの作成 -- DECLARE quantity integer := 80; BEGIN RAISE NOTICE 'Quantity here is %', quantity; -- Prints 80 RAISE NOTICE 'Outer quantity here is %', outerblock.quantity; -- Prints 50 RAISE NOTICE 'Quantity here is %', quantity; -- Quantity here is 80と表示 RAISE NOTICE 'Outer quantity here is %', outerblock.quantity; -- Quantity here is 50と表示 END; RAISE NOTICE 'Quantity here is %', quantity; -- Prints 50 RAISE NOTICE 'Quantity here is %', quantity; -- Quantity here is 50と表示 RETURN quantity; END; $$ LANGUAGE plpgsql;
There is actually a hidden <quote>outer block</quote> surrounding the body
of any <application>PL/pgSQL</application> function. This block provides the
declarations of the function's parameters (if any), as well as some
special variables such as <literal>FOUND</literal> (see
<xref linkend="plpgsql-statements-diagnostics"/>). The outer block is
labeled with the function's name, meaning that parameters and special
variables can be qualified with the function's name.
PL/pgSQL関数の本体を囲む、隠れた「外側のブロック」が存在します。
この隠れたブロックにおいて、関数のパラメータがあれば宣言をして、同様にFOUND
のような特殊な変数(41.5.5を参照)を提供します。
この外側のブロックのラベルは関数名となります。
つまりパラメータと特殊な変数は関数名によって修飾することを意味します。
It is important not to confuse the use of
<command>BEGIN</command>/<command>END</command> for grouping statements in
<application>PL/pgSQL</application> with the similarly-named SQL commands
for transaction
control. <application>PL/pgSQL</application>'s <command>BEGIN</command>/<command>END</command>
are only for grouping; they do not start or end a transaction.
See <xref linkend="plpgsql-transactions"/> for information on managing
transactions in <application>PL/pgSQL</application>.
Also, a block containing an <literal>EXCEPTION</literal> clause effectively
forms a subtransaction that can be rolled back without affecting the
outer transaction. For more about that see <xref
linkend="plpgsql-error-trapping"/>.
PL/pgSQLにおける文をまとめるためのBEGIN
/END
とトランザクション制御用の同名のSQLコマンドとを取り違えないようにすることが重要です。
PL/pgSQLのBEGIN
/END
は単にまとめるためのもので、トランザクションを始めたり終わらせたりしません。
トランザクションをPL/pgSQL内で制御するための情報に関しては、41.8を参照してください。
また、EXCEPTION
句を含むブロックは外側のトランザクションに影響しないでロールバックできるサブトランザクションを、実質的に作成できます。
これについては41.6.8を参照してください。