17,140
社区成员




-- 存储过程申明
CREATE OR REPLACE PROCEDURE sp_o2oOrderDt(
c_cursor OUT SYS_REFCURSOR,
p_whid in varchar2 default '',
p_orgid in char default '',
p_orderid in varchar2 default ''
)
IS
BEGIN
OPEN c_cursor FOR
select a.goodsid,a.goodsname,b.entname
from goodsdoc a join entdoc b on a.entid = b.entid;
END;
-- 调用
declare
ret sys_refcursor;
f_billsn int;
begin
f_billsn := 0;
sp_o2oOrderDt(ret, p_whid => '', p_orgid => '', p_orderid => '');
for rec in ret loop
dbms_output.put_line(rec.goodsname);
end loop;
end;
-- SYS_REFCURSOR 的结果,只能通过 fetch .. into 这种形式遍历
-- 用你的语句,简单的给你改了一个,你再研究一下
SQL> CREATE OR REPLACE PROCEDURE sp_o2oOrderDt(
2 c_cursor OUT SYS_REFCURSOR,
3 v_type varchar
4 )
5 IS
6 BEGIN
7 OPEN c_cursor FOR
8 select object_id, object_name from user_objects where object_type = v_type ;
9 END;
10 /
Procedure created
SQL> -- 调用
SQL> set serverout on;
SQL> declare
2 ret sys_refcursor;
3 id int;
4 name varchar(30);
5 begin
6
7 sp_o2oOrderDt(ret, v_type => 'TABLE');
8 loop
9 fetch ret into id, name ;
10 exit when ret%NOTFOUND;
11 dbms_output.put_line (id || ': '|| name);
12 end loop;
13 end;
14 /
73532: YYYY
73529: XX
73851: TTT
74185: C
PL/SQL procedure successfully completed
SQL> drop procedure sp_o2oOrderDt ;
Procedure dropped
SQL>