PL/pgSQLはブロック構造の言語です。 関数定義のテキスト全体はブロックでなければなりません。 ブロックは以下のように定義されます。
[ <<label>> ] [ DECLARE declarations ] BEGIN statements END [ label ];
ブロック内の宣言や文はそれぞれ、セミコロンで終わります。 上に示したように、他のブロック内に出現するブロックのENDの後にはセミコロンが必要ですが、関数本体を完結する最後のENDにセミコロンは不要です。
全てのキーワードと識別子は、大文字小文字を混在させて書くことができます。 識別子は二重引用符で括られていない限り暗黙的に小文字に変換されます。
PL/pgSQLのコメントには2種類あります。 二重のダッシュ記号(--)はその行の終わりまでをコメントとするコメントの始まりを意味します。 /*はコメントブロックの始まりを意味し、次に*/が現れるまでをコメントとします。 ブロックコメントは入れ子にすることはできませんが、二重ダッシュ形式のコメントはブロックコメント内に記述することは可能です。 また、二重ダッシュはブロックコメントの区切り文字/*と*/を隠します。
ブロックの文節内の全ての文は副ブロックになることができます。 副ブロックは論理的なグループ分けや変数を文の小さな集まりに局所化するのに使用できます。
ブロックの前の宣言節で宣言された変数は、関数呼び出しの際に一度だけ行われるのではなく、ブロックに入る度にデフォルト値で初期化されます。 以下に例を示します。
CREATE FUNCTION somefunc() RETURNS integer AS $$ 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と表示 END; RAISE NOTICE 'Quantity here is %', quantity; -- Quantity here is 50と表示 RETURN quantity; END; $$ LANGUAGE plpgsql;
PL/pgSQLにおける文をまとめるためのBEGIN/ENDとトランザクション制御用のデータベースコマンドとを取り違えないようにすることが重要です。 PL/pgSQLのBEGIN/ENDは単にまとめるためのもので、トランザクションを始めたり終わらせたりしません。 関数とトリガプロシージャは常に外側の問い合わせで確立されたトランザクションの内側で実行されます。 これらの命令とトランザクションの実行には何の関連もないので、これらはトランザクションを開始することもコミットすることもできません。 しかし、EXCEPTION句を含むブロックは外側のトランザクションに影響しないでロールバックできるサブトランザクションを、効果的に作成できます。 これに関することは項37.7.5を参照してください。