存储过程多表关联返回sys_refcursor,如何接收?

lxd99423 2016-12-26 10:45:20



-- 存储过程申明
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;


-- 调用时报错


因为实际关联了6张表,返回了几十个字段,不想挨个写字段,难道非得定义一个record类型来接收吗?或者能不能通过%rowtype类型来解决,高手指点一下

...全文
392 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
sych888 2016-12-27
  • 打赏
  • 举报
回复
create or replace procedure test_ref_cursor(v_cursor out sys_refcursor) as begin open v_cursor for select * from emp; end; --方法一,通过SQL PLUS 前台调用存储过程,代码块如下 SQL> declare 2 type v_cursor is ref cursor RETURN emp%RowType; 3 v_cur v_cursor; 4 v_temp v_cur%rowtype; 5 begin 6 test_ref_cursor(v_cur); 7 loop 8 exit when v_cur%notfound; 9 fetch v_cur into v_temp; 10 dbms_output.put_line(v_temp.ename); 11 end loop; 12 close v_cur; 13 end; 14 / --方法二,代码如下: declare type v_cursor is ref cursor; v_cur v_cursor; v_temp emp%rowtype; begin open v_cur for select * from emp; loop exit when v_cur%notfound; fetch v_cur into v_temp; dbms_output.put_line('v_temp='||v_temp.ename); end loop; close v_cur; end;
卖水果的net 2016-12-26
  • 打赏
  • 举报
回复

-- 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> 
H_Gragon 2016-12-26
  • 打赏
  • 举报
回复
不懂帮顶!

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧