FETCH ステートメントは、カーソルの位置を結果表の次の行に移し、その行の値をホスト変数に割り当てます。
呼び出し
対話式 SQL 機能には外見上対話式の実行に見えるインターフェースが用意されている場合がありますが、 このステートメントはアプリケーション・プログラムに組み込むことだけが可能です。 これは、動的に準備できない実行可能ステートメントです。
許可
カーソルを使用するために必要な権限については、DECLARE CURSOR を参照してください。
構文
>>-FETCH--+-------+---cursor-name-------------------------------> '-FROM--' .-,----------------. V | >-----+-INTO-----host-variable---+---------+------------------->< '-USING DESCRIPTOR--descriptor-name--'
そのカーソルの位置が、現在その結果表の最終行またはそれ以降にある場合、
ある行より前に現在カーソルが位置している場合、カーソルはその行に再位置づけされ、 INTO または USING で指定されたホスト変数に値が割り当てられます。
最終行以外の行に現在カーソルが位置している場合、カーソルは次の行に再位置づけされ、 その行の値は INTO または USING で指定されたホスト変数に割り当てられます。
FETCH ステートメントが処理される前に、 ユーザーは次に示す SQLDA 内のフィールドを設定する必要があります。
SQLDA には、すべての SQLVAR オカレンスが入るだけの十分な記憶域がなければなりません。 したがって、SQLDABC の値は 16 + SQLN*(N) 以上でなければなりません (N は 1 つの SQLVAR オカレンスの長さ)。
LOB または構造タイプの結果列を入れるには、 各選択リスト項目 (または結果表の列) ごとに 2 つの SQLVAR 項目が必要です。 SQLDOUBLED、LOB、および構造タイプの列について説明した、SQLDA に対する DESCRIBE の効果を参照してください。
SQLD に設定する値は、ゼロ以上で SQLN 以下でなければなりません。 詳しくは、付録 C, SQL 記述子域 (SQLDA)を参照してください。
INTO 文節で指定されるか、 または SQLDA に記述される n 番目の変数は、 カーソルの結果表の n 番目の列に対応します。 各変数のデータ・タイプは、それに対応する列と互換性がなければなりません。
各変数には、"言語要素"で説明されている規則に従って値が割り当てられます。 変数の数がその行の値の数よりも少ない場合、 SQLDA の SQLWARN3 フィールドが 'W' に設定されます。 変数の数が結果表の列の数よりも多い場合、警告は出されません。 割り当てエラーが発生すると、値は変数に割り当てられず、 値はそれ以上変数に割り当てられません。 それまでにすでに変数に割り当てられていた値はそのままになります。
例
例 1: この C の例では、 FETCH ステートメントは SELECT ステートメントの結果を取り出して、 プログラム変数 dnum、dname、 および mnum に入れます。 取り出す行がなくなった場合、見つからないことを示す状態が戻されます。
EXEC SQL DECLARE C1 CURSOR FOR SELECT DEPTNO, DEPTNAME, MGRNO FROM TDEPT WHERE ADMRDEPT = 'A00'; EXEC SQL OPEN C1; while (SQLCODE==0) { EXEC SQL FETCH C1 INTO :dnum, :dname, :mnum; } EXEC SQL CLOSE C1;
例 2: この FETCH ステートメントは SQLDA を使用しています。
FETCH CURS USING DESCRIPTOR :sqlda3