37.3. PL/pgSQLの構造

PL/pgSQLはブロック構造の言語です。 関数定義のテキスト全体はブロックでなければなりません。 ブロックは以下のように定義されます。

[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
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/pgSQLBEGIN/ENDは単にまとめるためのもので、トランザクションを始めたり終らせたりしません。 関数とトリガプロシージャは常に外側の問い合わせで確立されたトランザクションの内側で実行されます。 PostgreSQL ではトランザクションを入れ子にすることはできませんので、これらはトランザクションを開始することもコミットすることもできません。