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;


附上客户端调用方法:

oracle SYS_REFCURSOR返回结果集及动态游标使用方法_第1张图片


你可能感兴趣的:(SQL相关)