PL/pgSQL は ブロック構造 の言語です。関数定義のテキスト全体は ブロック でなければなりません。ブロックは以下のように定義されます。
[ <<label>> ] [ DECLARE declarations ] BEGIN statements END;
ブロックの文節内の全ての 文 は 副ブロック になることができます。副ブロックは論理的なグループ分けや変数を文の小さな集まりに局所化することに使用することができます。
ブロックの前の宣言節で宣言された変数は、関数呼び出しの際に一度だけ行われるのではなく、ブロックに入る度にデフォルト値で初期化されます。たとえば、以下のようにします。
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 は単にまとめるためのもので、トランザクションを始めたり終らせたりしません。関数とトリガプロシージャは常に外側の問い合わせで確立されたトランザクションの内側で実行されます。 PostgreSQL ではトランザクションを入れ子にすることはできませんので、これらはトランザクションを開始することもコミットすることもできません。
ブロック内の文と宣言はそれぞれセミコロンで終ります。
キーワードと識別子はすべて、大文字小文字を混ぜて記述することができます。識別子は二重引用符で括っていない限り、暗黙的に小文字に変換されます。
PL/pgSQL のコメントには2種類あります。二重のダッシュ記号 -- はその行の終りまでをコメントとするコメントの始まりを意味します。/* はコメントブロックの始まりを意味し、次に */ が現れるまでをコメントとします。ブロックコメントは入れ子にすることはできませんが、二重ダッシュ形式のコメントはブロックコメント内に記述することは可能です。 また、二重ダッシュはブロックコメントの区切り文字/* と */ を隠します。