カーソル問い合わせ全体を一度に実行するのではなく、カーソルを設定して、問い合わせをカプセル化し、問い合わせの結果を一度に数行ずつ読み取ることができます。これを行う理由の1つは、結果内に多数の行がある場合のメモリの枯渇を防ぐことです。(しかし、PL/pgSQLユーザは通常これを心配する必要はありません。FORループは自動的にカーソルを内部的に使用してメモリの問題を防ぐからです。興味深い使用方法として、呼び出し元が行を読み取ることをできるように、作成されたカーソルへの参照を返す方法があります。これにより、関数から大量の行集合を返す際の効率が向上します。カーソル変数の宣言PL/pgSQLにおけるカーソルへのアクセスは全て、カーソル変数を経由します。カーソル変数は、常に特殊なrefcursorデータ型です。カーソル変数を作成する1つの方法は、単にrefcursor型の変数として宣言することです。他の方法は、カーソル宣言構文を使用することです。以下にその一般形を示します。query;(Oracleとの互換性のため、FORはISに置き換えることができます。SCROLLを指定すれば、カーソルは逆方向に移動できます。SCROLLを指定すれば、逆方向の行の取り出しはできません。どちらも指定しない時、逆方向に取り出しできるかは問い合わせに依存します。datatypeをカンマで区切ったリストで、与えられた問い合わせ内のパラメータ値として置換される名前を定義します。その名前に実際に置換される値は、カーソルを開いた時点より後に指定されます。key;これら3つの変数は全てrefcursorデータ型を持ちますが、最初のものは全ての問い合わせに使用でき、2番目には完全な問い合わせが既にバウンドされています(結び付けられています)。(keyはカーソルが開いた時に整数パラメータ値に置き換えられます)。curs1変数は、特定の問い合わせに結び付けられていませんので、アンバウンドであると呼ばれます。カーソルを開くカーソルを使用して行を取り出す前に、開かれる必要があります。SQLコマンドの動作と同じです。PL/pgSQLには3種類のOPEN文があり、そのうちの2つはアンバウンドカーソル変数を使用し、残りの1つはバウンドカーソル変数を使用します。バウンドカーソル変数は項40.7.4で説明されているFOR文で、明示的にカーソルを開かなくても使用することができます。query;カーソル変数は開かれ、実行するよう指定した問い合わせが付与されます。開いたカーソルを開くことはできず、また、アンバウンドカーソル変数として(つまり、単なるrefcursor変数として)宣言されていなければなりません。この問い合わせはSELECT文であるか、または(EXPLAINのように)何らかの行を返すものでなければなりません。この問い合わせは、他のPL/pgSQLのSQL文と同様の方法で扱われます。PL/pgSQLの変数名は置き換えられ、問い合わせ計画は再利用できるようにキャッシュされます。PL/pgSQL変数がカーソルを使用する問い合わせに代入された時、変数はOPEN時の値となり、その後の変更はカーソルの動きに影響しません。SCROLLオプションの意味はバウンドカーソルと同様です。];カーソル変数は開かれ、実行するよう指定した問い合わせが付与されます。開いたカーソルを開くことはできず、また、アンバウンドカーソル変数として(つまり、単なるrefcursor変数として)宣言されていなければなりません。問い合わせは、EXECUTEコマンドと同じ方法による文字列式として指定されます。通常と同様に、これにより、次回に実行する際に違った問い合わせを計画できる柔軟性が得られます(項40.10.2参照)。変数置換がコマンド文字列上で行われないことも意味します。EXECUTEと同様にUSINGを介して動的コマンドにパラメータ値を挿入することができます。SCROLLオプションの意味はバウンドカーソルと同様です。keyvalue;この例では、テーブル名は問い合わせ内にテキストとして埋め込まれます。このためSQLインジェクションに対抗するためにquote_ident()の使用を勧めます。col1との比較値はUSING経由で埋め込まれますので、引用符を付ける必要がありません。];宣言時に問い合わせが結び付いたカーソル変数を開くために使用されるOPENの形式です。開いたカーソルを開くことはできません。実引数の式のリストはカーソルが引数を取るものと宣言された場合にのみ現れます。これらの値は問い合わせの中で置き換えられます。バウンドカーソルの問い合わせ計画は常にキャッシュ可能とみなされます。この場合、EXECUTEと等価なものはありません。SCROLLをOPENにおいて指定できないことに注意してください。カーソル移動の仕様はすでに決まっているからです。位置的表記または記名的表記を使用して、引数の値を渡すことができます。位置的表記では、全ての引数が順番に指定されます。記名的表記では、引数の式と区別するために:=を使用して、各々の引数の名前が指定されます。項4.3に記述した関数呼び出しと同様に、位置的表記と記名的表記を混用できます。例を示します(ここでは上例のカーソル宣言を使用します)。42);変数の代入はバウンドカーソルの問い合わせで行われるため、カーソルへ値を渡す方法が2つあります。OPENコマンドの明確な引数とするものと、問い合わせにおけるPL/pgSQL変数として暗黙的に参照するものです。バウンドカーソルの宣言より前に宣言した変数だけが代入されます。どちらの場合も、OPENの実行時に変数値が決まります。上例のcurs3と同じ結果を取得する方法を、以下に示します。カーソルの使用カーソルを開いてから、ここで説明する文を使用してカーソルを扱うことができます。これらの操作は、カーソルを開始するために開いた関数内で行う必要はありません。関数からrefcursor値を返し、呼び出し元でそのカーソルの操作をさせることもできます。(内部的にはrefcursor値は、カーソルへの有効な問い合わせを持つポータルの名前を示す単なる文字列です。この名前は、ポータルを壊すことなく、他のrefcursor型の変数に代入することで、他に渡すことができます。)全てのポータルは、暗黙的にトランザクションの終わりで閉ざされます。したがって、refcursor値はそのトランザクションの終わりまでの間のみ開いたカーソルへの参照として有効です。INTOと同様に、カーソルから次の行を抽出し、対象に格納します。対象とは、行変数、レコード変数、または単純な変数をカンマで区切ったリストです。INTOの場合と同様、特殊なFOUND変数を検査することで、行が入手できたかどうかを確認することができます。FETCHで許可されたどのようなコマンドも可能です。