Collection Contents 前へ 次へ PDF

ASA SQL リファレンス・マニュアル

SQL 文

FETCH 文 [ESQL] [SP]


説明 

この文は、カーソルを再配置し、そこからデータを取り出すために使用します。

構文 

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 文は、まず、先頭のローの前にカーソルを配置します。

カーソル位置の問題 
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 パーミッションが必要です。

関連する動作 

なし

参照 
標準と互換性 
 

次は、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;
END

Collection Contents 前へ 次へ PDF