天天看點

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;