匿名PL/SQL块调用具有集合的过程

匿名PL/SQL块调用具有集合的过程,sql,oracle,plsql,Sql,Oracle,Plsql,我需要测试一个接受PL/SQL表并返回SYS_REFCURSOR的包过程 我要寻找的是匿名PL/SQL块,它执行以下操作: 填充PL/SQL表并传递给过程 相关代码如下: create or replace type rec_typ as object ( fname varchar2(10), lname varchar2(10) ) / create or replace type rec

我需要测试一个接受PL/SQL表并返回SYS_REFCURSOR的包过程

我要寻找的是匿名PL/SQL块,它执行以下操作:

  • 填充PL/SQL表并传递给过程
相关代码如下:

create or replace type rec_typ as object
        (
                fname varchar2(10),
                lname varchar2(10)
        )
 /
 create or replace type rec_arr as table of rec_typ
 /
 create or replace package get_emp_pkg
 as
     procedure get_emp
      (
           l_rec rec_arr,
           p_out out sys_refcursor
    );
 end;
 /

 create or replace package body get_emp_pkg
 as

    procedure get_emp
    (
            l_rec rec_arr,
            p_out out sys_refcursor
    )
    as
            l_out rec_arr;
    begin

            open p_out for select * from table ( l_out );
    end;

end;
/

您需要声明和填充一个表集合,并声明一个游标变量;然后将它们传递到过程调用中;e、 g:

declare
  l_rec rec_arr;
  l_cur sys_refcursor;
begin
  l_rec := rec_arr(rec_typ('Joe','Bloggs'), rec_typ('Mary','Berry'));
  get_emp_pkg.get_emp(l_rec, l_cur);
  -- do something with the cursor
  close l_cur;
end;
/
如果您只是在测试它,并且正在使用SQL*Plus或SQL Developer,您可以将其简化为使用客户机绑定变量:

variable cur refcursor;

declare
  l_rec rec_arr;
begin
  l_rec := rec_arr(rec_typ('Joe','Bloggs'), rec_typ('Mary','Berry'));
  get_emp_pkg.get_emp(l_rec, :cur);
end;
/

print cur;
或者更简单地说:

variable cur refcursor;

begin
  get_emp_pkg.get_emp(rec_arr(rec_typ('Joe','Bloggs'), rec_typ('Mary','Berry')), :cur);
end;
/

print cur;
您甚至可以用
execute
调用来代替它,它只是匿名块的包装器,功能上几乎相同

但是你的程序有错误;您正在声明一个本地
l_out
变量,然后根据该变量打开ref游标,但您从未填充它-因此ref游标结果集将始终为空。如果您将其改为使用
l_rec
(尽管我将其称为
p_rec
,其中
p_
前缀表示参数,并将
l_
前缀保留为局部变量):

然后,上面的绑定变量版本都可以看到:

PL/SQL procedure successfully completed.


FNAME      LNAME     
---------- ----------
Joe        Bloggs    
Mary       Berry     

你想测试什么?您尝试了什么?@smnbbrv-只需能够使用伪值调用过程并打印光标结果即可
PL/SQL procedure successfully completed.


FNAME      LNAME     
---------- ----------
Joe        Bloggs    
Mary       Berry