目的
カーソルを応答セットの次の行(デフォルト)または任意指定の行に置き、その行の値をローカル変数やパラメータに割り当てます。
呼び出し
実行可能形式。
ストアド プロシージャのみ。
構文
- NEXT
- 応答セットから次の行(存在する場合)を取り出す。
- FIRST
- 応答セットから最初の行を取り出す。
- cursor_name
- オープンしている選択カーソル(割り当てられたカーソルを含む)の名前。ここから行が取り出されます。
- local_variable_name
- 取り出した行を割り当てるローカル変数の名前。
- parameter_reference
- 取り出した行を割り当てるINOUTまたはOUTパラメータの名前。
ANSI準拠
ANSI/ISO SQL:2011準拠。
許可
なし。
応答セットに行がない場合
- SQLCODEは7362に設定される
- SQLSTATEは‘02000’に設定される
システムは、この実行時警告条件をプロシージャ内で処理します。これが処理されないと、プロシージャは、失敗した取り出し操作の次の文から続行します。
取り出した行の割り当て順序
システムは行の値をローカル変数または出力パラメータに割り当てます。割り当て順序は、その変数およびパラメータをINTOリスト内で宣言した順になります。
一般ルール
指定したカーソルは、FETCHの実行時に開いている必要があります。
- SQLCODEは7631に設定される
- SQLSTATEは‘24501’に設定される
FETCHによって返される値の数は、INTOリスト内で宣言したローカル変数および出力パラメータの数と一致している必要があります。
不一致が確認されるタイミング | Teradata Databaseが返す内容 |
---|---|
コンパイル | コンパイル エラーSPL1027。 |
実行時 | 実行時例外:
|
取り出される列のデータ型は、その割り当て先のローカル変数またはOUTパラメータに指定したデータ型と一致しなければなりません。
これは特にUDTタイプに当てはまります。なぜなら、システムはタイプに定義されているどのキャストも暗黙的に適用しないからです。
- カーソル選択リストのデータ型を事前定義タイプからUDTへ、またはUDTから事前定義タイプへ明示的にCASTする(AS ASSIGNMENTオプションを指定するターゲット タイプへのキャストも定義している場合)。
- ターゲット タイプを戻すメソッドを呼び出す。
INTOリスト内のテーブル列に名前を付ける単純ターゲット指定を指すことはできません。無効なINTOリストを指定すると、システムはコンパイル時にエラーSPL1028を返します。
代わりに、出力パラメータ(INOUTおよびOUT)またはローカル変数を指定する必要があります。
FIRSTおよびNEXTのルール
- SQLCODEは7632に設定される
- SQLSTATEは‘02000’に設定される
この場合、この値のINTOリスト内で指定した出力パラメータまたはローカル変数は変更されません。
FIRSTを指定する場合は、参照カーソルの宣言にSCROLLを指定しなければなりません。
SCROLLを指定しておかないと、システムはコンパイル時にエラーSPL1132を返します。
- SQLCODEは7632に設定される
- SQLSTATEは‘02000’に設定される
この場合、この値のINTOリスト内で指定した出力パラメータまたはローカル変数は変更されません。
例: データ型が一致するローカル変数に割り当てられた列を返す
次の例では、FETCH文によって参照されるカーソルが、一致したデータ型を持つローカル変数に正しく割り当てられている列を戻す有効なカーソル指定となっています。
CREATE PROCEDURE sp1() BEGIN DECLARE var1 INTEGER; DECLARE var2 CHARACTER(30) DECLARE projcursor CURSOR FOR SELECT projid, projectdesc FROM project ORDER BY projid; OPEN projcursor; WHILE (SQLCODE=0) DO FETCH projcursor INTO var1, var2; END WHILE; CLOSE projcursor; END;
例: FETCH文およびWHILEループの使用
次の例では、カーソルがすでに応答セット内の最後の行の後ろに置かれているために、WHILEループの後のFETCH文で完了条件SQLCODE 7632およびSQLSTATE '02000'が生じており、「no rows found」というメッセージを返しています。
CREATE PROCEDURE sp1 (OUT par1 CHARACTER(50)) BEGIN DECLARE var1 INTEGER; DECLARE projcursor CURSOR FOR SELECT projid, projectdesc FROM project; OPEN projcursor; WHILE (SQLCODE = 0) DO FETCH projcursor INTO var1, par1; END WHILE; FETCH projcursor INTO var1, par1; CLOSE projcursor; END;
例: FETCH文内でのFETCH指向の使用
次の例は、FETCH文の中の取り出し方向の使用法を説明しています。projectテーブルにはsp1の実行開始時に10行が含まれているとします。
最初のFETCH文は最初の行を返し、projcursorがオープンしてから他に行が取り出されなかった場合、2番目のFETCHが2番目の行を返します。
CREATE PROCEDURE sp1 (OUT par1 INTEGER) BEGIN DECLARE var1 CHARACTER(5); DECLARE var2 INTEGER; DECLARE projcursor SCROLL CURSOR FOR SELECT projectstatus FROM project; OPEN projcursor; FETCH FIRST projcursor INTO var1; ... FETCH NEXT projcursor INTO var1; ... CLOSE projcursor; END;
例: FETCH FIRSTの使用
次に、FETCH FIRSTの使用法の例を示します。projectテーブルはsp1の実行開始時に空白であるとします。
テーブルに行が含まれていないため、FETCH文でコンパイル ステータスSQLCODE 7632およびSQLSTATE '02000'が発生し、「no rows found」というメッセージを返しています。
CREATE PROCEDURE sp1 (OUT par1 INTEGER) BEGIN DECLARE var1 CHARACTER(5); DECLARE var2 INTEGER; DECLARE projcursor SCROLL CURSOR FOR SELECT projectstatus FROM project; OPEN projcursor; FETCH FIRST projcursor INTO var1; ... CLOSE projcursor; END;