PL/SQL を記述して、パッケージ内の関数をテストしたいと考えています。パッケージはカーソルタイプを定義します
TYPE ref_cursor IS REF CURSOR;
そのタイプに基づいてレコードを定義したいと思います。
私のコードは次のとおりです。
DECLARE
cur PACKAGE_NAME.ref_cursor;
rec cur%ROWTYPE;
最後の行が正しくないのはなぜですか?
PL/SQL を記述して、パッケージ内の関数をテストしたいと考えています。パッケージはカーソルタイプを定義します
TYPE ref_cursor IS REF CURSOR;
そのタイプに基づいてレコードを定義したいと思います。
私のコードは次のとおりです。
DECLARE
cur PACKAGE_NAME.ref_cursor;
rec cur%ROWTYPE;
最後の行が正しくないのはなぜですか?
弱い型のREFCURSORに基づいてレコード型を定義することはできません。パッケージで定義されたカーソル・タイプを使用して、任意の列を持つ任意のクエリからデータを返すことができるため、PL / SQLコンパイラは、データをフェッチする適切なレコード・タイプを判別できません。
関数から返される実際のデータがわかっている場合は、そのタイプのレコードを宣言してデータをフェッチできます。たとえば、弱い型のカーソルタイプを返す関数を宣言したが、カーソルが実際にEMP
テーブルに基づいてカーソルを返すことがわかっている場合、データをレコードにフェッチできます(システム定義の弱い型のカーソルであることにEMP%ROWTYPE
注意してください)。 SYS_REFCURSOR
REF CURSORタイプ)
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;