PostgreSQL 8.0.0 文書
前のページ | 巻戻し |  | 早送り | 次のページ

# 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`は、整数定数で、符号を付けることができます。 `FORWARD`と`BACKWARD`の場合、負の`count`は、`FORWARD`と`BACKWARD`の意味を変更することと同じです。

`cursorname`

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

## 出力

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

## 互換性

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

`FORWARD`と`BACKWARD`を持つ`FETCH`の形式や、暗黙的な`FORWARD`を持つ`FETCH `count``と`FETCH ALL`はPostgreSQLの拡張です。

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

## 関連項目

CLOSE, DECLARE, MOVE

前のページ | ホーム | 次のページ
EXPLAIN | 上に戻る | GRANT