使用集合

时间:2018-04-04 17:55:03

标签: sql oracle plsql

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

我正在寻找的是Anonymous 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;
/

1 个答案:

答案 0 :(得分:1)

您需要声明并填充表集合,并声明一个游标变量;然后将它们传递给程序调用; 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变量,然后根据该变量打开引用游标,但您不会填充它 - 因此引用游标结果集将始终为空。如果你改变它使用l_rec,而不是(虽然我会说这就是p_rec,与p_前缀表示参数和离开l_局部变量前缀):< / p>

 create or replace package body get_emp_pkg
 as

    procedure get_emp
    (
            l_rec rec_arr,
            p_out out sys_refcursor
    )
    as
    begin
            open p_out for select * from table ( l_rec );
    end get_emp;

end;
/

然后上面的绑定变量版本都会看到:

PL/SQL procedure successfully completed.


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