この文は、カーソルを再配置し、そこからデータを取り出すために使用します。
FETCH cursor-position cursor-name
[ INTO { hostvar-list | variable-list }
| USING DESCRIPTOR sqlda-name ]
[ PURGE ]
[ BLOCK n ]
[ FOR UPDATE ]
[ ARRAY fetch-count ]
INTO variable-list [ FOR UPDATE ]
cursor-position :
NEXT | PRIOR | FIRST | LAST
| { ABSOLUTE | RELATIVE } row-count
row-count : number または hostvar
cursor-name : identifier または hostvar
hostvar-list: インジケータ変数も含むことができる
variable-list: ストアド・プロシージャ変数
sqlda-name : identifier
fetch-count : integer または hostvar
INTO INTO 句はオプションです。この句が指定されていない場合、FETCH 文はカーソルのみを配置します。hostvar-list は Embedded SQL でのみ使用されます。
カーソル位置 オプションの位置パラメータを指定して、カーソルを移動してからローをフェッチできます。FETCH 文に配置パラメータがあり、その場所が許可されたカーソルの範囲の外側である場合、SQLE_NOTFOUND の警告が表示され、SQLCOUNT フィールドには有効な位置からのオフセットが設定されます。
OPEN 文は、まず、先頭のローの前にカーソルを配置します。
NEXT デフォルトの位置付けは NEXT です。これはローをフェッチする前に、カーソルを 1 つ前方のローに進めます。
PRIOR ローをフェッチする前に、カーソルを 1 つ後方のローに戻します。
RELATIVE RELATIVE 配置を使用すると、フェッチする前にいずれかの方向へ指定した数のローだけカーソルを移動できます。正の数は前進を示し、負の数は後退を示します。したがって、NEXT は RELATIVE 1 と等しく、PRIOR は RELATIVE -1 と等しくなります。RELATIVE 0 は、このカーソル上の最後の FETCH 文と同じローを取り出します。
ABSOLUTE ABSOLUTE 配置パラメータを使用すると、特定のローに移動できます。0 は先頭のローの前の位置を示します (プロシージャとトリガでのカーソルの使用を参照してください)。
1 は先頭のローを示し、残りのローがそれに続きます。負の数を使ってカーソルの最後からの絶対位置を指定します。-1 はカーソルの最後のローを示します。
FIRST ABSOLUTE 1 の省略形。
LAST ABSOLUTE -1 の省略形。
カーソル位置の問題DYNAMIC SCROLL カーソルに挿入や更新をいくつか行うと、カーソルの位置の問題が生じます。SELECT 文に ORDER BY 句を指定しないかぎり、データベース・サーバはカーソル内の予測可能な位置にはローを挿入しません。場合によって、カーソルを閉じてもう一度開かないと、挿入したローが表示されないことがあります。テンポラリ・テーブルを作成してカーソルを開いた場合に、これが起こります (詳細については、クエリ処理中のワーク・テーブルの使用を参照してください)。 UPDATE 文は、カーソル中でローを動かすことがあります。カーソルが既存のインデックスを使う ORDER BY 句を持っている場合に、これが起こります (テンポラリ・テーブルは作成されません)。 |
BLOCK 句 クライアント・アプリケーションは一度に複数のローをフェッチできます。これはブロック・フェッチ、プリフェッチ、またはマルチロー・フェッチと呼ばれます。最初のフェッチによって、いくつかのローがサーバから送り返されます。クライアントはこれらのローをバッファに格納します。後に続くフェッチは、サーバへ新しい要求を行わないで、これらのバッファからローを取り出します。
BLOCK 句は Embedded SQL でのみ使用されます。この句は、クライアントとサーバにアプリケーションがフェッチできるローの個数に関する情報を与えます。0 という特別な値は、要求をサーバに送信し、シングル・ローを返すことを示します (ロー・ブロックはありません)。BLOCK 句を指定すると、BLOCK 値を次にプリフェッチするときに含められるローの数が削減されます。プリフェッチされるローの数を増やすには、PrefetchRows 接続パラメータを使用します。
BLOCK 句を指定しない場合は、OPEN に指定された値が使われます。詳細については、OPEN 文 [ESQL] [SP] を参照してください。
FETCH RELATIVE 0 は常にローを再フェッチします。
PURGE 句 PURGE 句は Embedded SQL でのみ使用されます。この句によって、クライアントはすべてのローのバッファをフラッシュし、次にフェッチ要求をサーバに送信します。このフェッチ要求はローのブロックを返すことに注意してください。
FOR UPDATE 句 FOR UPDATE 句は、フェッチされたローが続いて UPDATE WHERE CURRENT OF CURSOR 文によって更新されることを示します。この句は、データベース・サーバがローに対して書き込みロックを設定するようにします。ロックは、現在のトランザクションの終わりまで保持されます。ロックの仕組みを参照してください。
ARRAY 句 ARRAY 句は Embedded SQL でのみ使用されます。この句を使うと、いわゆるワイド・フェッチができるようになります。これは複数のローを同時に取り出し、パフォーマンスを改善します。
Embedded SQL でワイド・フェッチを使用するには、コードに次のような fetch 文を含めます。
EXEC SQL FETCH . . . ARRAY nnn
ARRAY nnn は FETCH 文の最後の項目です。フェッチ回数を示す nnn にはホスト変数も使用できます。SQLDA には nnn * (ローあたりのカラム数) 変数を入れてください。最初のローは SQLDA の変数 0 から (ローあたりのカラム数) -1 に入り、以後のローも同様です。
ワイド・フェッチの詳細な使用例については、一度に複数のローをフェッチするの項を参照してください。
FETCH 文は指定したカーソルからローを 1 つ取り出します。事前にカーソルを開いておきます。
Embedded SQL での使用 DECLARE CURSOR 文は、C ソース・コード内の FETCH 文の前に置きます。また、OPEN 文を実行してから FETCH 文を実行します。ホスト変数をカーソル名の代わりに使用している場合、DECLARE 文は実際にコードを生成するため、FETCH 文の前に実行します。
サーバは SQLCOUNT にフェッチされたレコードの数を返し、エラーがない場合は 0 より大きい SQLCOUNT を常に返します。エラーではなくて SQLCOUNT が 0 の場合、有効なローが 1 つフェッチされたことを示します。
フェッチ時に SQLSTATE_NOTFOUND 警告が返される場合、SQLCA (SQLCOUNT) の sqlerrd[2] フィールドには、フェッチの試みが許可されるカーソル位置を超えたときのローの数が含まれます。たとえば、位置が最後のローのときに FETCH RELATIVE 1 を実行した場合です。カーソルの最後を超えてフェッチしようとした場合、値は正の数です。カーソルの先頭を超えてフェッチしようとした場合、値は負の数です。
FETCH 文の実行が成功した後、SQLCA (SQLIOCOUNT) の sqlerrd[1] フィールドはフェッチを実行するのに必要な入出力操作の数だけ増加します。このフィールドは、実際にはデータベース文が発行されるたびに増加します。
シングル・ロー・フェッチ SELECT 文の結果からの 1 つのローは、変数リストの変数の中に置かれます。select リスト対ホスト変数リストは、1 対 1 に対応します。
マルチロー・フェッチ SELECT 文の結果からの 1 つまたは複数のローは、variable-list の変数の中、または指定した sqlda-name が記述するプログラム・データ領域の中のいずれかに置かれます。select-list 対 hostvar-list または対 sqlda-name 記述子配列は、どちらも 1 対 1 で対応します。
カーソルを開いておいてください。また、ユーザはカーソルの宣言内で参照されるテーブルの SELECT パーミッションが必要です。
なし
SQL/92 初級レベル機能。プロシージャでの使用は、永続的ストアド・モジュール機能です。
SQL/99 コア機能。プロシージャでの使用は、永続的ストアド・モジュール機能です。
Sybase Adaptive Server Enterprise でサポートされます。
次は、Embedded SQL の例です。
EXEC SQL DECLARE cur_employee CURSOR FOR SELECT emp_id, emp_lname FROM employee; EXEC SQL OPEN cur_employee; EXEC SQL FETCH cur_employee INTO :emp_number, :emp_name:indicator;
次は、プロシージャの例です。
BEGIN
DECLARE cur_employee CURSOR FOR
SELECT emp_lname
FROM employee;
DECLARE name CHAR(40);
OPEN cur_employee;
LOOP
FETCH NEXT cur_employee into name;
...
END LOOP
CLOSE cur_employee;
ENDSQL Anywhere Studio 9.0.2
Copyright © 1989–2005 Sybase, Inc. Portions copyright © 2001–2005 iAnywhere Solutions, Inc. All rights reserved.