FETCH — カーソルを使用して問い合わせから行を取り出す
FETCH [direction
[ FROM | IN ] ]cursor_name
ここでdirection
は空にするか、次のいずれかを指定します。 NEXT PRIOR FIRST LAST ABSOLUTEcount
RELATIVEcount
count
ALL FORWARD FORWARDcount
FORWARD ALL BACKWARD BACKWARDcount
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
は全て、カーソルを移動することなく現在の行を取り出します。
つまり、一番最後に取り出した行を再度取り出すことになります。
カーソルが先頭行の前や最終行の後になければ、これらのコマンドは成功します。
先頭行の前や最終行の後にあれば、行は返されません。
このマニュアルページではSQLコマンドレベルでのカーソルの使用方法について説明しています。 PL/pgSQL内でカーソルを使用する場合は、規則が異なりますので、43.7.3を参照してください。
direction
direction
は、取り出す方向と取り出す行数を定義します。
以下のいずれかを指定できます。
NEXT
次の行を取り出します。
これは、direction
が省略された時のデフォルトです。
PRIOR
1つ前の行を取り出します。
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
1つ次の行を取り出します
(NEXT
と同じです)。
FORWARD count
次のcount
行分の行を取り出します。
FORWARD 0
と指定すると、現在の行を再度取り出します。
FORWARD ALL
残っている行を全て取り出します。
BACKWARD
1つ前の行を取り出します
(PRIOR
と同じです)。
BACKWARD count
前のcount
行分の行を(逆方向に走査して)取り出します。
BACKWARD 0
と指定すると、現在の行を再度取り出します。
BACKWARD ALL
現在位置より前の行を(逆方向に走査して)全て取り出します。
count
count
は、整数定数で、符号を付けることができ、取り出す位置や行数を決定します。
FORWARD
とBACKWARD
において、count
に負の値を指定するのは、FORWARD
とBACKWARD
の意味を入れ替えるのと同等です。
cursor_name
開いているカーソルの名前を指定します。
正常に終了すると、FETCH
コマンドは以下の形式のコマンドタグを返します。
FETCH count
count
は取り出した行数です(0の可能性もあります)。
psqlでは取り出した行数を別途表示するため、このコマンドタグは実際には表示されないことに注意してください。
FETCH
コマンドとして、FETCH NEXT
もしくは正のcountのFETCH FORWARD
以外を使用する場合、カーソルをSCROLL
オプション付きで宣言しなければなりません。
単純な問い合わせでは、PostgreSQLでは、カーソルがSCROLL
付きで宣言されていなくても後方向の取り出しを行うことができることがありますが、この動作に依存すべきではありません。
カーソルがNO SCROLL
付きで宣言された場合は、後方向の取り出しを行うことができません。
ABSOLUTE
による取り出しは、相対的な指定による指定行への移動に比べて高速ではありません。
内部的な実装では、必ず中間の行を全て経由しているからです。
絶対指定で負の値を指定した場合、速度はさらに悪化します。
まず、最終行を見つけるために最後まで問い合わせを読み取って、その後に最終行から後方に移動するためです。
ただし、(FETCH ABSOLUTE 0
を使用して)問い合わせの先頭へ戻るのは高速です。
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 -- 1つ前の行を取り出します。 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
を使用するオプション、または、どちらも省略することはPostgreSQLの拡張です。