目的
呼び出し側のストアド プロシージャから、呼び出し先のストアド プロシージャが返した結果セットを取り出せるようにします。
呼び出し
実行可能形式。
ストアド プロシージャ。
構文
- cursor_name
- 事前に開かれている参照先カーソルの名前。
- procedure_name
- 呼び出し先のSQLストアド プロシージャの名前。
ANSI準拠
ANSI/ISO SQL:2011準拠。
許可
なし。
ルール
- 最初にNO SCROLLでカーソルが開かれていると、そのカーソルは結果セットの「最初の行」に配置されます。
たとえば、最初のカーソルが10行の行を返し、そのうちの3行をストアド プロシージャが読み取ったとすると、残りの7行が返されます。結果セットは4番目の行から始まりますが、その行が最初の行のように見えます。
- 最初にSCROLLでカーソルが開かれていると、そのカーソルは直前に取り出された行の直後の行に配置されます。
例えば、カーソルが全部で10行を返したとすると、初期位置は4番目の行になります。
- カーソルがSCROLLで開かれていれば、呼び出し側が直前に取り出された行より前の行にカーソルを再配置できます。
- カーソルがNO SCROLLまたはSCROLLのどちらで開かれていても、結果セットが複数ある場合には、それぞれの結果セットを連続的に取り出します。
- プロシージャが結果セットを作成しない場合や、すべての結果セットが取り出されてしまっている場合には、SQLSTATE完了条件'02001' (返される追加の動的結果セットが存在しない)が返されます。
- 最初の結果セットの末尾に達した時点で、そのFETCH文にはSQLSTATE '02000' (データが存在しない)が設定されます。次に続く結果セットがあるときには、その結果セットを取得するために、開いているカーソルを閉じる必要があります。
- 追加の結果セットがないときにカーソルを閉じると、そのCLOSE文にはSQLSTATE完了条件'02001' (返される追加の動的結果セットが存在しない)が返されることになります。
- 追加の結果セットが存在する場合、次の警告が返されます。'0100D' (返される追加の動的結果セットが存在する)。
例: ALLOCATEの使用
REPLACE PROCEDURE alloc007() DYNAMIC RESULT SETS 1 BEGIN DECLARE EmpNo0 SMALLINT; DECLARE ProjId0 CHAR(8); DECLARE WkEnd0 DATE; DECLARE Hours0 DECIMAL(4,1); DECLARE ee0 CHAR(8); DECLARE ff0 VARCHAR(25); DECLARE gg0 DATE; DECLARE hh0 DATE; DECLARE ii0 DATE; CALL drs_temp5(); ALLOCATE my_fetch CURSOR FOR PROCEDURE drs_temp5; FETCH FIRST FROM my_fetch INTO empno0,projid0,wkend0,hours0; INSERT INTO charges_temp2(empno0,projid0,wkend0,hours0); WHILE (SQLCODE = 0) DO FETCH NEXT FROM my_fetch INTO empno0,projid0,wkend0,hours0; IF (SQLCODE = 0) THEN INSERT INTO charges_temp2(empno0,projid0,wkend0,hours0); END IF; END WHILE; -- close the current result set cursor CLOSE my_fetch; -- see if there are result sets WHILE (SQLSTATE = '0100D') DO -- allocate the next one. ALLOCATE sp2 CURSOR FOR PROCEDURE drs_temp5; WHILE (SQLCODE = 0) DO FETCH NEXT FROM sp2 into ee0,ff0,gg0,hh0,ii0; IF (SQLCODE = 0) THEN INSERT INTO project_temp1(ee0,ff0,gg0,hh0,ii0); END IF; END WHILE; CLOSE sp2; END WHILE; END;