匿名PL/SQL块调用具有集合的过程
我需要测试一个接受PL/SQL表并返回SYS_REFCURSOR的包过程 我要寻找的是匿名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表并传递给过程
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