制御構造はおそらくPL/pgSQLの最も有用(かつ重要)な部分です。PL/pgSQLの制御構造を使用して、PostgreSQLのデータを非常に柔軟、強力に操作することができます。関数からデータを返すために使用できるコマンドが2つあります。expression;式を持つRETURNは関数を終了し、expressionの値を呼び出し元に返します。この形式は集合を返さないPL/pgSQL関数で使用されます。スカラ型を返す場合は任意の式を使用することができます。この式の結果は、代入のところで説明したように、自動的に関数の戻り値の型にキャストされます。複合(行)値を返すためには、expressionとしてレコードもしくは行変数を記述しなければなりません。出力パラメータを持った関数を宣言した時は、式の無いRETURNを記述してください。その時点における出力パラメータの値が返されます。voidを返すように関数を宣言した場合でも、関数を直ちに抜け出すためにRETURNを使用できますが、RETURNの後に式を記述しないでください。関数の戻り値は未定義とさせたままにすることはできません。制御が、RETURN文が見つからない状態で関数の最上位のブロックの終わりまで達した時、実行時エラーが発生します。この制限は出力パラメータを持った関数及びvoidを返す関数には当てはまりません。このような場合は最上位のブロックが終わった時、RETURN文が自動的に実行されます。sometypeを返すように宣言した場合、後続の処理が多少違います。QUERYコマンドで指定されます。引数のない最後のRETURNコマンドにより、関数が実行を終了したことが示されます。NEXTは、スカラ型および複合型の両方で使用することができます。複合型の場合、結果の"テーブル"全体が返されます。QUERYは、問い合わせを実行した結果を関数の結果集合に追加します。QUERYは、単一の集合を返す関数の中で自由に混合できます。この場合、連結されたものが結果となります。QUERYは関数から戻りません。関数の結果集合に行を追加しているだけです。その実行はPL/pgSQL関数内の次の文に継続します。QUERYコマンドが連続して実行されると、結果集合が作成されます。(または制御を関数の最後に移すことができます)。EXECUTEという亜種があり、それは問い合わせが動的に実行されることを指定します。パラメータ式を、EXECUTEコマンド内と全く同じように、USINGによって演算された問い合わせ文字列に挿入することができます。NEXTだけを記述してください。実行の度に、その時点における出力パラメータの値が、関数からの戻り値のために結果の行として保存されます。sometypeを返すように関数を宣言しなければならないことに注意してください。NEXTを使用する関数の例を以下に示します。QUERYの現在の実装では、関数から返される前に結果集合全体を保管します。これにより、PL/pgSQL関数が非常に大量の結果集合を返した場合、性能が低下する可能性があります。メモリの枯渇を避けるため、データはディスクに書き込まれます。関数自体は結果集合全体が生成されるまでは戻りません。将来のPL/pgSQLのバージョンでは、この制限を受けずに集合を返す関数をユーザが定義できるようになるかもしれません。現在、データがディスクに書き込まれ始まる時点はwork_mem設定変数によって制御されています。大量の結果集合を保管するのに十分なメモリがある場合、管理者はこのパラメータの値を大きくすることを考慮すべきです。条件分岐IFとCASE文はある条件に基づいて代わりのコマンドを実行させます。PL/pgSQLには、以下のような3つのIFの形式があります。ELSEまた、以下のような2つのCASEの形式があります。IF;IF-THEN文は最も単純なIFの形式です。IFの間の文が条件が真の場合に実行されます。なければそれらは飛ばされます。IF;IF-THEN-ELSE文はIF-THENに加え、条件評価が偽の場合に実行すべき代替となる文の集合を指定することができます。(これには条件がNULLと評価した場合も含まれることに注意してください。IF;選択肢が2つだけではなくより多くになる場合があります。IF-THEN-ELSIFは、順番に複数の代替手段を検査する、より便利な方法を提供します。IF条件は最初の真である結果が見つかるまで連続して検査されます。IF以降の次の文に制御が渡されます。(以降にあるIF条件の検査はすべて実行されません。全てのIF条件が真でない場合、ELSEブロックが(もし存在すれば)実行されます。