天天看點

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 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;