如何使用记录来循环引用游标?

Ale*_*ang 3 oracle plsql record ref-cursor

我想编写PL/SQL来测试包中的函数.包定义了游标类型

TYPE ref_cursor IS REF CURSOR;
Run Code Online (Sandbox Code Playgroud)

我想基于该类型定义记录.

我的代码是:

DECLARE
  cur PACKAGE_NAME.ref_cursor; 
  rec cur%ROWTYPE;
Run Code Online (Sandbox Code Playgroud)

为什么最后一行不正确?

Jus*_*ave 13

您无法基于弱类型的REF CURSOR定义记录类型.由于包中定义的游标类型可用于从具有任意列的任意查询返回数据,因此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;
Run Code Online (Sandbox Code Playgroud)