CREATE OR REPLACE PROCEDURE RIVUS.STEP01_SELECT1
IS
BEGIN
FOR vRec IN (
SELECT'data1' COLNAME_1 FROM DUALUNION ALL SELECT'data2' COLNAME_1 FROM DUAL
) LOOP
-- 暗黙カーソルの各属性は使用できない。DBMS_OUTPUT.PUT(NVL(TO_CHAR(SQL%ROWCOUNT),'NULL') || ':');
DBMS_OUTPUT.PUT_LINE(vRec.COLNAME_1);
END LOOP;
END;
/
---- 実行結果
SQL> call step01_select1();
NULL:data1
NULL:data2
コールが完了しました。
注意:Oracle 10g 現在、暗黙カーソルを使用した FOR ループ中で 暗黙カーソル の識別子 「SQL」の各属性を使用することができない。
CREATE OR REPLACE PROCEDURE RIVUS.STEP01_SELECT2(P_DATA_1 IN VARCHAR2)
IS
CURSOR cDual(P_DATA_2 VARCHAR2 := 'CURSOR param') IS
SELECT P_DATA_1 COLNAME_1 FROM DUALUNION ALL SELECT P_DATA_2 COLNAME_1 FROM DUAL ;
BEGIN
FOR vRec IN cDual('xxx') LOOP
DBMS_OUTPUT.PUT(cDual%ROWCOUNT || ':');
DBMS_OUTPUT.PUT_LINE(vRec.COLNAME_1);
END LOOP;
END;
/
---- 実行結果
SQL> call step01_select2('SELECT2');
1:SELECT2
2:xxx
コールが完了しました。
上記の例は FOR ループ処理の内部で カーソルのオープンとフェッチ処理が行なわれていたが、それを明示的に行なうループ処理を記述してみる。
CREATE OR REPLACE PROCEDURE RIVUS.STEP01_SELECT3(P_DATA_1 IN VARCHAR2)
IS
CURSOR cDual(P_DATA_2 VARCHAR2 := 'CURSOR param') IS
SELECT P_DATA_1 COLNAME_1 FROM DUALUNION ALL SELECT P_DATA_2 COLNAME_1 FROM DUAL ;
vRec cDual%ROWTYPE;
BEGIN
OPEN cDual('yyy') ; -- 引数付きのカーソルをオープン
LOOP
FETCH cDual INTO vRec; -- カーソルの内容をフェッチする
EXIT WHEN cDual%NOTFOUND;
DBMS_OUTPUT.PUT(cDual%ROWCOUNT || ':');
DBMS_OUTPUT.PUT_LINE(vRec.COLNAME_1);
END LOOP;
CLOSE cDual; -- 使用済のカーソルは必ずクローズすること
END;
/
---- 実行結果
SQL> call step01_select3('SELECT3');
1:SELECT3
2:yyy
コールが完了しました。