3

PL/SQL を記述して、パッケージ内の関数をテストしたいと考えています。パッケージはカーソルタイプを定義します

TYPE ref_cursor IS REF CURSOR;

そのタイプに基づいてレコードを定義したいと思います。

私のコードは次のとおりです。

DECLARE
  cur PACKAGE_NAME.ref_cursor; 
  rec cur%ROWTYPE;

最後の行が正しくないのはなぜですか?

4

1 に答える 1

13

弱い型のREFCURSORに基づいてレコード型を定義することはできません。パッケージで定義されたカーソル・タイプを使用して、任意の列を持つ任意のクエリからデータを返すことができるため、PL / SQLコンパイラは、データをフェッチする適切なレコード・タイプを判別できません。

関数から返される実際のデータがわかっている場合は、そのタイプのレコードを宣言してデータをフェッチできます。たとえば、弱い型のカーソルタイプを返す関数を宣言したが、カーソルが実際にEMPテーブルに基づいてカーソルを返すことがわかっている場合、データをレコードにフェッチできます(システム定義の弱い型のカーソルであることにEMP%ROWTYPE注意してください)。 SYS_REFCURSORREF 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;
于 2012-02-22T01:57:33.063 に答える