PL/pgSQLはブロック構造の言語です。 関数定義のテキスト全体はブロックでなければなりません。 ブロックは以下のように定義されます。
[ <<label
>> ] [ DECLAREdeclarations
] BEGINstatements
END [label
];
ブロック内の宣言や文はそれぞれ、セミコロンで終わります。
上に示したように、他のブロック内に出現するブロックのEND
の後にはセミコロンが必要ですが、関数本体を完結する最後のEND
には不要です。
BEGIN
の直後にセミコロンを書くことも、同じように間違いです。
これは不正であり、構文エラーとなります。
label
が必要となるのは、EXIT
文が使用されるブロックを特定したい場合、またはブロック内で宣言された変数名を修飾したい場合だけです。
END
の後にラベルを配置する時は、そのブロックの先頭ラベルと一致させなければなりません。
全てのキーワードは大文字と小文字を区別しません。 識別子は二重引用符でくくられていない限り、通常のSQLコマンドと同様に、暗黙的に小文字に変換されます。
PL/pgSQLコード内では、通常のSQLと同じ方法のコメントが動作します。
二重のダッシュ(--
)はその行末までをコメントとするコメントを開始します。
/*
はコメントブロックの始まりを意味し、次に*/
が現れるまでをコメントとします。
ブロックコメントは入れ子になります。
ブロックの文節内の全ての文は副ブロックになることができます。 副ブロックは論理的なグループ分けや変数を文の小さな集まりに局所化するのに使用できます。 副ブロックにおいて宣言された変数は、副ブロック内部では外側のブロックにおける同名の変数を遮蔽しますが、外側のラベルを変数名に付加して指定すればアクセスできます。 以下に例を示します。
CREATE FUNCTION somefunc() RETURNS integer AS $$ << outerblock >> DECLARE quantity integer := 30; BEGIN RAISE NOTICE 'Quantity here is %', quantity; -- Quantity here is 30と表示 quantity := 50; -- -- 副ブロックの作成 -- DECLARE quantity integer := 80; BEGIN 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; -- Quantity here is 50と表示 RETURN quantity; END; $$ LANGUAGE plpgsql;
PL/pgSQL関数の本体を囲む、隠れた「外側のブロック」が存在します。
この隠れたブロックにおいて、関数のパラメータがあれば宣言をして、同様にFOUND
のような特殊な変数(40.5.5. 結果ステータスの取得を参照)を提供します。
この外側のブロックのラベルは関数名となります。
つまりパラメータと特殊な変数は関数名によって修飾することを意味します。
PL/pgSQLにおける文をまとめるためのBEGIN
/END
とトランザクション制御用の同名のSQLコマンドとを取り違えないようにすることが重要です。
PL/pgSQLのBEGIN
/END
は単にまとめるためのもので、トランザクションを始めたり終わらせたりしません。
関数とトリガプロシージャは常に外側の問い合わせで確立されたトランザクションの内側で実行されます。
トランザクションの実行させる文脈はありませんので、これらはトランザクションを開始することもコミットすることもできません。
しかし、EXCEPTION
句を含むブロックは外側のトランザクションに影響しないでロールバックできるサブトランザクションを、実質的に作成できます。
これについては40.6.6. エラーの捕捉を参照してください。