無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

40.2. PL/pgSQL の構造

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

[
 <<

label

>> 
]
[
 DECLARE
    

declarations

 
]
BEGIN
    

statements


END [
 

label

 
];

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

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

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

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

PL/pgSQL コード内では、通常の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 のような特殊な変数( 項40.5.5 を参照)を提供します。 この外側のブロックのラベルは関数名となります。 つまりパラメータと特殊な変数は関数名によって修飾することを意味します。

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


powered by SEO.CUG.NET