PL/pgSQLの構造PL/pgSQLはブロック構造の言語です。関数定義のテキスト全体はブロックでなければなりません。ブロックは以下のように定義されます。];ブロック内の宣言や文はそれぞれ、セミコロンで終わります。上に示したように、他のブロック内に出現するブロックのENDの後にはセミコロンが必要ですが、関数本体を完結する最後のENDには不要です。BEGINの直後にセミコロンを書くことも、同じように間違いです。これは不正であり、構文エラーとなります。labelが必要となるのは、EXIT文が使用されるブロックを特定したい場合、またはブロック内で宣言された変数名を修飾したい場合だけです。ENDの後にラベルを配置する時は、次のブロックの先頭ラベルと一致させなければなりません。全てのキーワードは大文字と小文字を区別しません。識別子は二重引用符でくくられていない限り、通常のSQLコマンドと同様に、暗黙的に小文字に変換されます。PL/pgSQLコード内では、通常のSQLと同じ方法のコメントが動作します。二重のダッシュ(--)はその行末までをコメントとするコメントを開始します。/*はコメントブロックの始まりを意味し、次に*/が現れるまでをコメントとします。ブロックコメントは入れ子になります。ブロックの文節内の全ての文は副ブロックになることができます。副ブロックは論理的なグループ分けや変数を文の小さな集まりに局所化するのに使用できます。副ブロックにおいて宣言された変数は、副ブロック内部では外側のブロックにおける同名の変数を遮蔽しますが、外側のラベルを変数名に付加して指定すればアクセスできます。PL/pgSQL関数の本体を囲む、隠れた"外側のブロック"が存在します。この隠れたブロックにおいて、関数のパラメータがあれば宣言をして、同様にFOUNDのような特殊な変数(項39.5.5を参照)を提供します。この外側のブロックのラベルは関数名となります。パラメータと特殊な変数は関数名によって修飾することを意味します。PL/pgSQLにおける文をまとめるためのBEGIN/ENDとトランザクション制御用の同名のSQLコマンドとを取り違えないようにすることが重要です。PL/pgSQLのBEGIN/ENDは単にまとめるためのもので、トランザクションを始めたり終わらせたりしません。関数とトリガプロシージャは常に外側の問い合わせで確立されたトランザクションの内側で実行されます。トランザクションの実行させる文脈はありませんので、これらはトランザクションを開始することもコミットすることもできません。EXCEPTION句を含むブロックは外側のトランザクションに影響しないでロールバックできるサブトランザクションを、実質的に作成できます。これについては項39.6.5を参照してください。