明示的なカーソルが混乱しているようです。例:
declare
cursor cur is
select dummy from dual;
begin
for rec in cur
loop
dbms_output.put_line(rec.dummy);
end loop;
end;
/
参照カーソルを使用-開いているカーソルへのポインタです。
通常、refカーソルを使用してデータベース内のカーソルを開き、呼び出し元のアプリに戻してループさせます。
refカーソルをoutパラメーターとして宣言し、同じ手順でそれらをループしようとした方法は意味がありません。カーソルからレコードをフェッチすると、それを再フェッチすることはできません。
どうしても参照カーソルをループする必要がある場合は、次のような構文を使用します。
declare
cur sys_refcursor;
rec dual%rowtype;
begin
open cur for select dummy from dual;
loop
fetch cur into rec;
exit when cur%notfound;
dbms_output.put_line(rec.dummy);
end loop;
end;
/
しかし、私が言ったように、一般的には、データベース内の参照カーソルをループすることはなく、呼び出し元のコードでループすることになります。
おそらく、満たそうとしている要件で質問を更新した場合は、それを行うためのより良い方法を提案することができます。