FETCH

Name

FETCH  -- カーソルを使用してテーブルから行を取り出す

Synopsis

FETCH [ direction ] [ count ] { IN | FROM } cursor
FETCH [ FORWARD | BACKWARD | RELATIVE ] [ # | ALL | NEXT | PRIOR ] 
    { IN | FROM } cursor

  

入力

direction

selector は行を取り出す方向を定義します。次のうちの 1 つを使用できます。

FORWARD

後方の行を取り出します。これは、selector が省略された場合のデフォルト値です。

BACKWARD

前方の行を取り出します。

RELATIVE

SQL92 との互換性のためだけの余分な単語です。

count

count は何行取り出すのかを決定します。次のうちの 1 つを使用できます。

#

取り出す行数の指定を行なう符号付き整数です。負の整数値は FORWARD と BACKWARD の意味を切替えることと同じであることに注意して下さい。

ALL

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

NEXT

引数 count に 1 を指定することと同じです。

PRIOR

引数 count に -1 を指定することと同じです。

cursor

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

出力

FETCH は指定カーソルによって定義された問い合わせの結果を返します。問い合わせが失敗した場合には次のメッセージが返されます。

WARNING: PerformPortalFetch:portal "cursor" not found

カーソル が事前に宣言されていない場合です。カーソルはトランザクションブロック内で宣言されなければなりません。

WARNING: FETCH/ABSOLUTE not supported, using RELATIVE

PostgreSQL はカーソルの絶対位置指定をサポートしていません。

ERROR: FETCH/RELATIVE at current position is not supported

SQL92 では、以下の構文を使ってカーソルの"現在位置"から繰り返しデータを取り出すことができます。

FETCH RELATIVE 0 FROM cursor.
	

PostgreSQL では、現在この記述方法を サポートしていません。 実際ゼロという値は全ての行を取り出さなければならないことを示すものとして予約されており、ALL キーワードを指定したことと同じことになります。RELATIVE キーワードが使用された場合、PostgreSQLは、そのユーザが SQL92 の振舞いを意図したものと見なし、エラーメッセージを返します。

説明

FETCH によりユーザはカーソルを使って行を取得することができます。取得される行数は # で指定されます。もしカーソルに残る行数が #より少ない場合、有効な行だけが取り出されます。行数の代わりとして ALL キーワードで代用すると、カーソルの残りの行全てが取り出されます。FORWARD(前方)にもBACKWARD(後方)にもインスタンスを取り出すことができます。デフォルトの方向は FORWARD です。

Tip: 負の値も行数の指定に使用することができます。負の値は FORWARD キーワードと BACKWARD キーワードの意味を逆にすることと同じです。例えば、FORWARD -1BACKWARD 1 と同じになります。

注釈

FORWARD と BACKWARD キーワードは PostgreSQL の言語拡張であることに注意して下さい。また、SQL92構文も、このコマンドの 2 番目の形式として指定したものでサポートされています。詳細については後述の互換性に関する論点を参照して下さい。

通常、カーソルでの更新をどのように元にしたテーブルに戻すかを決定することは、VIEW での更新の場合と同様にできませんので、カーソル内のデータの更新は PostgreSQL でサポートされていません。データを入れ換えるには、明示的に UPDATE コマンドを発行する必要があります。

カーソルが保存しているデータは複数のユーザの問い合わせでも使わ れますので、カーソルはトランザクションの内側でのみ使用できます。

カーソルの位置を変えるためには MOVE を使用して下さい。DECLARE はカーソルを定義します。トランザクションに関する更に詳しい情報はBEGINCOMMITおよびROLLBACKを参照して下さい。

使用方法

以下の例はカーソルを使ってテーブル内を行き来する列です。

カーソルを設定し使用します。

BEGIN WORK;
DECLARE liahona CURSOR FOR SELECT * FROM films;

-- カーソル liahona から最初の5行を取り出します。
FETCH FORWARD 5 IN 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 BACKWARD 1 IN liahona;

 code  | title   | did | date_prod  | kind   | len
-------+---------+-----+------------+--------+-------
 P_301 | Vertigo | 103 | 1958-11-14 | Action | 02:08

-- カーソルを閉じコミットします。

CLOSE liahona;
COMMIT WORK;

互換性

SQL92

Note: カーソルの非埋め込み使用は PostgreSQLの拡張です。カーソルの構文と使用は SQL92で定義される埋め込み形式のカーソルと比較されています。

SQL92 は FETCH のカーソルの絶対位置を指定することができます。 また、結果を明示的な変数に入れることができます。

FETCH ABSOLUTE #
    FROM cursor
    INTO :variable [, ...]
    

ABSOLUTE

カーソルは特定の絶対行番号に位置されるべきです。すべてのPostgreSQL 行番号は相対的な数ですのでこの機能はサポートされていません。

:variable

目的のホスト変数です。