oracle 函数循环结果集,oracle函数返回结果集(动态查询Sql并定义游标)

create or replace function f_xxcg_kqtjzb

(p_dwid in varchar2, --单位

p_ry in varchar2, --人员姓名(模糊匹配)

p_startDate in varchar2, --开始时间

p_endDate in varchar2 ) --结束时间

return kqtjzb_table_type pipelined

is

/**

* 根据查询条件,统计考勤相关数据

* author: cjianquan

* date: 2015-4-20

*/

v_query_sql varchar2(4000) ; --动态查询sql

type cur_type is REF CURSOR;--定义游标类型

rtn_cur cur_type; --定义游标变量

v_kqtjzb_row kqtjzb_row_type;--考勤统计的行数据

type dwry_type is record(

dw varchar2(100) ,

ryid varchar2(100),

wdkcl int

);

dwry_record dwry_type;

begin

v_query_sql:='select distinct a.rypbsz_ssdw, b.ryzbszmx_ryid,a.RYPBSZ_WDKCL'

||' from tbl_kqxt_ryzbsz a,tbl_kqxt_ryzbszmx b'

||' where a.ryzbsz_id=b.ryzbszmx_fk ';

if p_dwid is not null then

v_query_sql:=v_query_sql||' '||'and a.rypbsz_ssdwid='''||p_dwid||'''';

end if;

if p_ry is not null then

v_query_sql:=v_query_sql||' '||'and b.ryzbszmx_ryxm like ''%'||p_ry||'%''';

end if;

if p_startDate is not null then

v_query_sql:=v_query_sql||' '||'and to_date(b.RYZBSZMX_RQ,''yyyy-MM-dd'') >= to_date('''||p_startDate||''',''yyyy-MM-dd'')';

end if;

if p_endDate is not null then

v_query_sql:=v_query_sql||' '||'and to_date(b.RYZBSZMX_RQ,''yyyy-MM-dd'') <= to_date('''||p_endDate||''',''yyyy-MM-dd'')';

else

v_query_sql:=v_query_sql||' '||'and to_date(b.RYZBSZMX_RQ,''yyyy-MM-dd'') <=sysdate';

end if;

dbms_output.put_line(v_query_sql);

--打开游标

open rtn_cur for v_query_sql;

loop

--循环游标,将记录放至dwry_record

fetch rtn_cur into dwry_record;

exit when rtn_cur%NOTFOUND;

--调用函数f_xxcg_kqtjzb_row得到一行数据

if p_endDate is not null then

v_kqtjzb_row:=f_xxcg_kqtjzb_row(dwry_record.dw,dwry_record.ryid,p_startDate,p_endDate,dwry_record.wdkcl);

pipe row(v_kqtjzb_row);

else

v_kqtjzb_row:=f_xxcg_kqtjzb_row(dwry_record.dw,dwry_record.ryid,p_startDate,to_char(sysdate,'yyyy-MM-dd'),dwry_record.wdkcl);

pipe row(v_kqtjzb_row);

end if;

end loop;

return;

end;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值