PL/pgSQLの構造

PostgreSQL 8.0.0 文書
前のページ | 巻戻し | 第 35章PL/pgSQL - SQL手続き言語 | 早送り | 次のページ

# 35.3. PL/pgSQLの構造

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

    [ <<label>> ]
    [ DECLARE
        declarations ]
    BEGIN
        statements
    END;

ブロック内の宣言や文はそれぞれ、セミコロンで終ります。 上に示したように、他のブロック内に出現するブロックの `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` 句を含むブロックは外側のトランザクションに影響しないでロールバックできるサブトランザクションを、実効的に作成できます。 これに関することは項35.7.5を参照してください。

前のページ | ホーム | 次のページ
PL/pgSQLによる開発向けのヒント | 上に戻る | 宣言