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 or 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;