【问题标题】:How to use record to loop a ref cursor?如何使用记录来循环引用游标?
【发布时间】:2012-02-21 21:04:11
【问题描述】:

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

TYPE ref_cursor IS REF CURSOR;

我想根据该类型定义一条记录。

我的代码是:

DECLARE
  cur PACKAGE_NAME.ref_cursor; 
  rec cur%ROWTYPE;

为什么最后一行不正确?

【问题讨论】:

  • 能把游标类型的声明贴在包里吗?特别是,包是声明强游标还是弱游标?
  • 嗨贾斯汀,这是我要测试的包中的声明。 (TYPE ref_cursor 是 REF CURSOR;)

标签: oracle plsql record ref-cursor


【解决方案1】:

您不能基于弱类型 REF CURSOR 定义记录类型。由于包中定义的游标类型可用于从具有任意列的任意查询返回数据,因此 PL/SQL 编译器无法确定将数据提取到的适当记录类型。

如果您知道函数返回的实际数据,则可以声明该类型的记录以将数据提取到其中。例如,如果我声明了一个返回弱类型游标类型的函数,但我知道游标确实返回基于 EMP 表的游标,我可以将数据提取到 EMP%ROWTYPE 记录中(注意 @987654323 @ 是系统定义的弱类型 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;

【讨论】:

  • 声明 l_rc sys_refcursor; l_emp emp%rowtype;开始如果我不知道 l_emp 的类型或没有对象类型的权限怎么办
猜你喜欢
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多