PL/pgSQLの構造

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

# 38.2. PL/pgSQLの構造

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

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

ブロック内の宣言や文はそれぞれ、セミコロンで終わります。 上に示したように、他のブロック内に出現するブロックの`END`の後にはセミコロンが必要ですが、関数本体を完結する最後の`END`には不要です。

> ティップ: `BEGIN`の直後にセミコロンを書くことも、同じように間違いです。 これは誤記であり、構文エラーとなります。

`label`が必要となるのは、`EXIT`文が使用されるブロックを特定したい場合、またはブロック内で宣言された変数名を修飾したい場合だけです。 `END`の後にラベルを配置する時は、次のブロックの先頭ラベルと一致させなければなりません。

全てのキーワードは大文字と小文字を区別しません。 識別子は二重引用符で括られていない限り、通常の SQL コマンドと同様に、暗黙的に小文字に変換されます。

PL/pgSQLのコメントには2種類あります。 二重のダッシュ記号（`--`）はその行の終わりまでをコメントとするコメントの始まりを意味します。 `/*`はコメントブロックの始まりを意味し、次に`*/`が現れるまでをコメントとします。 ブロックコメントは通常のSQLと同じく入れ子になります。

ブロックの文節内の全ての文は副ブロックになることができます。 副ブロックは論理的なグループ分けや変数を文の小さな集まりに局所化するのに使用できます。 副ブロックにおいて宣言された変数は、副ブロック内部では外側のブロックにおける同名の変数を遮蔽しますが、外側のラベルを変数名に付加して指定すればアクセスできます。 以下に例を示します。

    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関数の本体を囲んで、隠れた"外側のブロック"が存在します。 この隠れたブロックにおいて、関数のパラメータがあれば宣言をして、同様に`FOUND`のような特殊な変数を提供します（項38.5.5を見てください）。 この外側のブロックのラベルは関数名となり、パラメータと特殊な変数は関数名によって指定できます。

PL/pgSQLにおける文をまとめるための`BEGIN`/`END`とトランザクション制御用の同名の SQL コマンドとを取り違えないようにすることが重要です。 PL/pgSQLの`BEGIN`/`END`は単にまとめるためのもので、トランザクションを始めたり終わらせたりしません。 関数とトリガプロシージャは常に外側の問い合わせで確立されたトランザクションの内側で実行されます。 これらの命令とトランザクションの実行には何の関連もないので、これらはトランザクションを開始することもコミットすることもできません。 しかし、`EXCEPTION`句を含むブロックは外側のトランザクションに影響しないでロールバックできるサブトランザクションを、効果的に作成できます。 これに関することは項38.6.5を参照してください。

前のページ | ホーム | 次のページ
概要 | 上に戻る | 宣言