この文は、カーソルを再配置し、そこからデータを取り出すために使用します。
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 つ前方のローに進めます。
RELATIVE 句 RELATIVE 配置を使用すると、フェッチする前にいずれかの方向へ指定した数のローだけカーソルを移動できます。正の数は前進を示し、負の数は後退を示します。そのため、NEXT は RELATIVE 1 と等しく、PRIOR は RELATIVE -1 と等しくなります。RELATIVE 0 は、このカーソル上の最後の FETCH 文と同じローを取り出します。
ABSOLUTE 句 ABSOLUTE 配置パラメータを使用すると、特定のローに移動できます。0 は先頭のローの前の位置を示します (プロシージャとトリガでのカーソルの使用を参照してください)。
1 は先頭のローを示し、残りのローがそれに続きます。負の数を使ってカーソルの最後からの絶対位置を指定します。-1 はカーソルの最後のローを示します。
DYNAMIC SCROLL カーソルに挿入や更新をいくつか行うと、カーソルの位置の問題が生じます。SELECT 文に ORDER BY 句を指定しないかぎり、データベース・サーバはカーソル内の予測可能な位置にはローを挿入しません。場合によって、カーソルを閉じてもう一度開かないと、挿入したローが表示されないことがあります。
これは、カーソルを開くためにテンポラリ・テーブルを作成する必要がある場合に起こります。詳細については、クエリ処理におけるワーク・テーブルの使用 (All-rows 最適化ゴールの使用)を参照してください。
UPDATE 文によって、カーソル内のローが移動することがあります。これは、既存のインデックスを使用する ORDER BY 句がカーソルに指定されている場合に発生します (テンポラリ・テーブルは作成されません)。
BLOCK 句 クライアント・アプリケーションは一度に複数のローをフェッチできます。これはブロック・フェッチ、プリフェッチ、またはマルチロー・フェッチと呼ばれます。最初のフェッチによって、いくつかのローがデータベース・サーバから送り返されます。クライアントはこれらのローをバッファに格納します。後に続くフェッチは、データベース・サーバへ新しい要求を行わないで、これらのバッファからローを取り出します。
BLOCK 句は Embedded SQL でのみ使用されます。この句は、クライアントとサーバに、アプリケーションがフェッチできるローの個数に関する情報を与えます。0 という特別な値は、要求をデータベース・サーバに送信し、シングル・ローを返すことを示します (ロー・ブロックはありません)。BLOCK 句を指定すると、BLOCK 値を次にプリフェッチするときに含められるローの数が削減されます。プリフェッチされるローの数を増やすには、PrefetchRows 接続パラメータを使用します。
BLOCK 句を指定しない場合は、OPEN に指定した値が使用されます。OPEN 文 [ESQL] [SP]を参照してください。
FETCH RELATIVE 0 は常にローを再フェッチします。
カーソルのプリフェッチが無効な場合、BLOCK 句は無視され、ローは一度に 1 つずつフェッチされます。ARRAY も指定している場合、ARRAY で指定されたロー数がフェッチされます。
PURGE 句 PURGE 句は Embedded SQL でのみ使用されます。この句によって、クライアントはすべてのローのバッファをフラッシュし、次にフェッチ要求をデータベース・サーバに送信します。このフェッチ要求はローのブロックを返すことに注意してください。
FOR UPDATE 句 FOR UPDATE 句は、フェッチされたローが続いて UPDATE WHERE CURRENT OF CURSOR 文によって更新されることを示します。この句は、データベース・サーバがローに対して意図的なロックを設定するようにします。ロックは、現在のトランザクションの終わりまで保持されます。ロックの仕組みと、SELECT 文の FOR UPDATE 句を参照してください。
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 を常に返します。
フェッチ時に SQLSTATE_NOTFOUND 警告が返される場合、SQLCA (SQLCOUNT) の sqlerrd[2] フィールドには、フェッチの試みが許可されるカーソル位置を超えたときのローの数が含まれます。ローが見つからなくても位置が有効な場合は、値は 0 です。たとえば、カーソル位置が最後のローのときに 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/2003 コア機能。プロシージャでの使用は、永続的ストアド・モジュール機能です。
次は、Embedded SQL の例です。
EXEC SQL DECLARE cur_employee CURSOR FOR SELECT EmployeeID, Surname FROM Employees; EXEC SQL OPEN cur_employee; EXEC SQL FETCH cur_employee INTO :emp_number, :emp_name:indicator; |
次は、プロシージャの例です。
BEGIN DECLARE cur_employee CURSOR FOR SELECT Surname FROM Employees; DECLARE name CHAR(40); OPEN cur_employee; lp: LOOP FETCH NEXT cur_employee into name; IF SQLCODE <> 0 THEN LEAVE lp END IF; ... END LOOP; CLOSE cur_employee; END |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |