弱い型のREFCURSORに基づいてレコード型を定義することはできません。パッケージで定義されているカーソルタイプを使用して、任意の列を持つ任意のクエリからデータを返すことができるため、PL/SQLコンパイラはデータをフェッチするための適切なレコードタイプを判別できません。
関数から返される実際のデータがわかっている場合は、そのタイプのレコードを宣言してデータをフェッチできます。たとえば、弱い型のカーソルタイプを返す関数を宣言したが、カーソルが実際にはEMP
に基づいてカーソルを返すことがわかっている場合です。 テーブルでは、データをEMP%ROWTYPE
にフェッチできます レコード(SYS_REFCURSOR
に注意してください システム定義の弱い型のREFCURSOR型です)
create or replace function f1
return sys_refcursor
is
l_rc sys_refcursor;
begin
open l_rc
for select *
from emp;
return l_rc;
end;
declare
l_rc sys_refcursor;
l_emp emp%rowtype;
begin
l_rc := f1;
loop
fetch l_rc into l_emp;
exit when l_rc%notfound;
dbms_output.put_line( l_emp.empno );
end loop;
end;