FETCH

Name

FETCH  --  カーソルを使用した行の入手。

Synopsis

FETCH [ selector ] [ count ] { IN | FROM } cursor
FETCH [ RELATIVE ] [ { [ # | ALL | NEXT | PRIOR ] } ] FROM ] cursor
  

入力

selector

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

FORWARD

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

BACKWARD

前方の(複数)行を取り出します。

RELATIVE

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

count

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

#

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

ALL

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

NEXT

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

PRIOR

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

cursor

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

出力

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

NOTICE: PerformPortalFetch: portal "cursor" not found

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

NOTICE: FETCH/ABSOLUTE not supported, using RELATIVE

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

ERROR: FETCH/RELATIVE at current position is not supported

SQL92 では

FETCH RELATIVE 0 FROM cursor
	
という構文を使ってカーソルの "現在位置" から繰り返し、データ を取り出すことができます。

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

説明

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

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

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

全ての行がいったん取り出されると、その後の全ての取り出しアクセス は行を返しません。

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

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

注意

カーソルの位置を変更する場合は MOVE を使 用して下さい。DECLARE はカーソルを定義し ます。トランザクションに関するより詳細については BEGINCOMMITROLLBACK を参照して下さい。

使用法

   -- カーソルを設定し使用する。
   --
   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;
   

互換性

非埋め込み型のカーソル使用は Postgres の 拡張です。このカーソルの構文と使用法は SQL92で定 義されている埋め込み形式と比較されてきました。

SQL92

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

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

ABSOLUTE

カーソルの位置は指定した絶対行番号に変更されなければなりませ ん。Postgres では全ての行番号は相 対的な番号ですので、この機能はサポートされません。

:variable

対象となるホスト変数(複数可)。