天天看点

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;