--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;
附上客户端调用方法: