FETCH [ direction { FROM | IN } ] cursorname ここで、directionは空か以下のいずれかです。 NEXT PRIOR FIRST LAST ABSOLUTE count RELATIVE count count ALL FORWARD FORWARD count FORWARD ALL BACKWARD BACKWARD count BACKWARD ALL
FETCHは事前に作成されたカーソルを使用して行を取り出します。
カーソルは関連する位置情報を持ち、FETCHはこれを使用します。 カーソル位置は問い合わせの結果の先頭行の前、結果内の任意の特定の行、結果の最終行の後を取ることができます。 生成時、カーソルの位置は先頭行の前を指しています。 行を取り出した後、カーソルの位置は最近に取り出した行を指します。 FETCHが利用可能な行の終わりまで達した時、カーソルの位置は最終行の後を、もし、後方抽出の場合は先頭行の前を指し続けます。 FETCH ALLもしくはFETCH BACKWARD ALLでは、カーソルの位置は常に最終行の後、もしくは、先頭行の前を指しています。
NEXT、PRIOR、FIRST、LAST、ABSOLUTE、RELATIVE形式では、カーソルを適切に移動した後、1つの行を取り出します。 行が存在しない場合、空の結果が返され、カーソルはそのまま先頭行の前か最終行の後を指し続けます。
FORWARDおよびBACKWARDを使用した形式では、指定数の行を前方もしくは後方方向に取り出し、カーソルの位置は最後に取り出した行を指します。 (countが利用可能な行数を越えていた場合は、全行の後/前を指します。)
RELATIVE 0、FORWARD 0、およびBACKWARD 0は全て、カーソルを移動すること無く現在の行を取り出します。 つまり、最も最近取り出した行を再度取り出します。 カーソルが先頭行の前や最終行の後になければ、これは成功します。 カーソルが先頭行の前や最終行の後にあれば、行は返されません。
directionは、取り出す方向と取り出す行数を定義します。 以下のいずれかを取ることができます。
次の行を取り出します。 これは、directionが省略された時のデフォルトです。
前の行を取り出します。
問い合わせの先頭行を取り出します。 (ABSOLUTE 1 と同一です。)
問い合わせの最終行を取り出します。 (ABSOLUTE -1と同一です。)
問い合わせのcount番目の行を取り出します。 もし、countが負ならば、終わりからabs(count)番目の行を取り出します。 countが範囲外の場合、位置は先頭行の前か最終行の後になります。 特に、ABSOLUTE 0では先頭行の前を指すようになります。
現在位置からcount番目の行を取り出します。 countが負の場合、現在位置よりabs(count)行前の行を取り出します。 RELATIVE 0は、もし現在の行があれば、その行を再度取り出します。
次のcount行を取り出します。 (FORWARD countと同一です。)
残る行を全て取り出します。 (FORWARD ALLと同一です。)
次の行を取り出します。 (NEXTと同一です。)
次のcount行を取り出します。 FORWARD 0は現在の行を再度取り出します。
残る行を全て取り出します。
前の行を取り出します。 (PRIORと同一です。)
前のcount行を(後方向に走査して)取り出します。 BACKWARD 0は現在の行を再度取り出します。
全ての前の行を(後方向に走査して)取り出します。
取り出す位置や行数を決定するcountは、整数定数で、符号を付けることができます。 FORWARDとBACKWARDの場合、負のcountは、FORWARDとBACKWARDの意味を変更することと同じです。
開いているカーソルの名前です。
正常に終了すると、FETCHコマンドは以下の形式のコマンドタグを返します。
FETCH count
countは(0を含む)取り出した行数です。 psqlは取り出した行数を別途表示しますので、psqlでは、このコマンドタグは実際には表示されないことに注意してください。
FETCH NEXTもしくはFETCH FORWARD以外の種類のFETCHを使用しようとする場合、そのカーソルをSCROLLオプション付きで宣言しなければなりません。 単純な問い合わせでは、PostgreSQLにより、カーソルがSCROLL付きで宣言されていなくても後方向の取り出しを行うことができますが、この動作に依存すべきではありません。 カーソルがNO SCROLL付きで宣言された場合は、後方向の取り出しを行うことができません。
相対的な指定による指定行への移動に比べ、ABSOLUTEによる取り出しは高速ではありません。 内部の実装では、必ず中間の行を移動するからです。 負の絶対指定による取り出しでは、もっと悪化します。 最終行を見付けるために必ず最後まで問い合わせを読み取らなければならず、そして、その後に最終行から後方に移動しますためです。 ただし、(FETCH ABSOLUTE 0を使用して)問い合わせの先頭へ戻る時には高速です。
現在、PostgreSQLでは、カーソルを使用したデータの更新をサポートしていません。
DECLAREを使用してカーソルを定義します。 データを取り出さずにカーソル位置を変更する場合はMOVEを使用してください。
以下の例では、カーソルを使用してテーブル内を行き来します。
BEGIN WORK; -- カーソルを設定します。 DECLARE liahona SCROLL CURSOR FOR SELECT * FROM films; -- liahonaカーソルから最初の5行を取り出します。 FETCH FORWARD 5 FROM liahona; code | title | did | date_prod | kind | len -------+-------------------------+-----+------------+----------+------- BL101 | The Third Man | 101 | 1949-12-23 | Drama | 01:44 BL102 | The African Queen | 101 | 1951-08-11 | Romantic | 01:43 JL201 | Une Femme est une Femme | 102 | 1961-03-12 | Romantic | 01:25 P_301 | Vertigo | 103 | 1958-11-14 | Action | 02:08 P_302 | Becket | 103 | 1964-02-03 | Drama | 02:28 -- 前の行を取り出します。 FETCH PRIOR FROM liahona; code | title | did | date_prod | kind | len -------+---------+-----+------------+--------+------- P_301 | Vertigo | 103 | 1958-11-14 | Action | 02:08 -- カーソルを閉じ、トランザクションを終了します。 CLOSE liahona; COMMIT WORK;