我需要测试一个接受PL / SQL表并返回SYS_REFCURSOR的包过程。
我正在寻找的是Anonymous 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;
/
答案 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