[11/15開催: PostgreSQL Conference Japan 2019 参加受付中] 
他のバージョンの文書 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

23.2. PL/pgSQL の構造

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 は 30 です。
   quantity := 50;
   --
   -- 副ブロックの作成
   --
   DECLARE
      quantity INTEGER := 80;
   BEGIN
      RAISE NOTICE ''Quantity here is %'',quantity;  -- ここでの quantity は 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 ではトランザクションを入れ子にすることはできませんので、これらはトランザクションを開始することもコミットすることもできません。

23.2.1. 字句の詳細

ブロック内の文と宣言はそれぞれセミコロンで終ります。

キーワードと識別子はすべて、大文字小文字を混ぜて記述することができます。識別子は二重引用符で括っていない限り、暗黙的に小文字に変換されます。

PL/pgSQL のコメントには2種類あります。二重のダッシュ記号 -- はその行の終りまでをコメントとするコメントの始まりを意味します。/* はコメントブロックの始まりを意味し、次に */ が現れるまでをコメントとします。ブロックコメントは入れ子にすることはできませんが、二重ダッシュ形式のコメントはブロックコメント内に記述することは可能です。また、二重ダッシュはブロックコメントの区切り文字/**/ を隠します。