FETCH

名前

FETCH -- カーソルを使用したテーブルからの行の抽出

概要

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 は、取り出す方向と取り出す行数を定義します。 以下のいずれかをとることができます。

NEXT

次の行を取り出します。 これは、directionが省略された時のデフォルトです。

PRIOR

前の行を取り出します。

FIRST

問い合わせの先頭行を取り出します。 (ABSOLUTE 1 と同一です。)

LAST

問い合わせの最終行を取り出します。 (ABSOLUTE -1と同一です。)

ABSOLUTE count

問い合わせのcount番目の行を取り出します。 もし、count が負ならば、終りからabs(count)番目の行を取り出します。 count が範囲外の場合、位置は先頭行の前か最終行の後になります。 特に、ABSOLUTE 0 では先頭行の前を指すようになります。

RELATIVE count

count 番目以降の行を取り出します。 count が負の場合、abs(count) 番目以前の行を取り出します。 RELATIVE 0 は、もし現在の行があれば、その行を再度取り出します。

count

次の count 行を取り出します。 (FORWARD count と同一です。)

ALL

残る行を全て取り出します。 (FORWARD ALLと同一です。)

FORWARD

次の行を取り出します。 (NEXT と同一です。)

FORWARD count

次の count行を取り出します。 FORWARD 0 は現在の行を再度取り出します。

FORWARD ALL

残る行を全て取り出します。

BACKWARD

前の行を取り出します。 (PRIORと同一です。)

BACKWARD count

前のcount行を(後方を走査して)取り出します。 BACKWARD 0は現在の行を再度取り出します。

BACKWARD ALL

全ての前の行を(後方を走査して)取り出します。

count

count は整数定数で、符号を付けることができ、取り出す位置や行数を決定します。 FORWARDBACKWARD の場合、負のcount は、FORWARDBACKWARD の意味を変更することと同じです。

cursorname

開いているカーソルの名前です。

出力

正常に終了すると、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;

互換性

標準SQLでは、埋め込みSQLでの使用のみで FETCH を定義しています。 ここで説明した各種の FETCH は、ホスト変数に代入されるのではなく、SELECTの結果であるかのようにデータを返します。 この点を除き、SELECT は完全に標準SQLと上位互換性があります。

FORWARDBACKWARDを持つFETCHの形式や、暗黙的な FORWARD を持つFETCH countFETCH ALLPostgreSQLの拡張です。

標準SQLではカーソル名の前にFROMのみを付けることができます。 IN を使用するオプションは拡張です。