oracle SYS_REFCURSOR返回结果集及动态游标使用方法



--ref光标可以返回到客户端,这就是从Oracle的存储过程返回结果集的方式
 create or replace PROCEDURE GET_WebLine(logintime IN date
                        ,X_RET_CODE        OUT VARCHAR2
                        ,X_RET_MSG         OUT VARCHAR2
                        ,X_RET_DATA        OUT SYS_REFCURSOR) IS
  BEGIN
    OPEN X_RET_DATA FOR
      select w.login_user,w.login_time,w.loginout_time            
      --select w.*     对应 r_emp qms_web_online%rowtype
      from qms_web_online w
      where to_char(w.login_time,'yyyy-MM-dd')=to_char(logintime,'yyyy-MM-dd');
      X_RET_CODE:=SQLERRM;
  EXCEPTION
    WHEN OTHERS THEN
      X_RET_CODE := SQLCODE;
      X_RET_MSG  := SQLERRM; 
    
  END;
 

declare
    X_RET_CODE varchar2(100);
    v_cursor SYS_REFCURSOR;
    X_RET_MSG varchar2(100);
    r_emp qms_web_online%rowtype; --r_emp:代表qms_web_online这个表,定义的游标也必须包含这个表的所有列,不然会报ora-06504 PL / SQL类型::返回结果集的变量或查询不匹配
begin
    GET_WebLine(sysdate(),X_RET_CODE,X_RET_MSG,v_cursor);
 loop
   fetch v_cursor into r_emp;
   exit when v_cursor%notfound;
   dbms_output.put_line(r_emp.login_user || ',' || r_emp.login_time);
 end loop;
 close v_cursor; 
end;

declare
    X_RET_CODE varchar2(100);
    v_cursor SYS_REFCURSOR;
    X_RET_MSG varchar2(100);
    v_name qms_web_online.login_user%type; --这里定义的变量数量要和输出游标里返回的列名数量一致
    v_time qms_web_online.login_time%type;
    v_outt qms_web_online.loginout_time%type;
begin
    GET_WebLine(sysdate(),X_RET_CODE,X_RET_MSG,v_cursor);
 loop
   fetch v_cursor into v_name,v_time,v_outt;
   exit when v_cursor%notfound;
   dbms_output.put_line(v_name || ',' || v_time);
   end loop;
   close v_cursor; 
   dbms_output.put_line(X_RET_MSG);
end;

---静态游标 cursor
declare
cursor xsun is
select w.login_user,w.login_time
      from qms_web_online w
      where to_char(w.login_time,'yyyy-MM-dd')=to_char(sysdate(),'yyyy-MM-dd');
v_name qms_web_online.login_user%type;
v_time qms_web_online.login_time%type;
begin
 if(not xsun%isopen) then
 open xsun;
 end if;
 loop
   fetch xsun into v_name,v_time;
   exit when xsun%notfound;
   dbms_output.put_line(v_name || ',' || to_char(v_time,'yyyy-MM-dd hh24:mi:ss') || ',' || xsun%rowcount);
   if(xsun%rowcount=12) then   --只输入前两行数据
   exit;
   end if;
 end loop;
 close xsun;
end;


附上客户端调用方法:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值