oracle pipelined返回值函数 针对数据汇总统计 返回结果集方法
生活随笔
收集整理的這篇文章主要介紹了
oracle pipelined返回值函数 针对数据汇总统计 返回结果集方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
近期需要一個匯總統計,由于數據太多,數據量太大所以在java程序中實現比較困難。若用后臺程序統計,數據不能保證實時,同時實現周期比較長。顧使用函數返回結果集的方式,在不增加臨時表的情況下實時獲取數據。需求為:多個端口流量每五分鐘累計匯總一次。如果用程序實現則為講所有數據取出做每五分鐘統計,元數據獲取帶來的數據量將是10萬條以上。 在數據庫中做匯總統計只需要24*12=288條記錄。 具體實現方式如下: /*打開日志輸出*/Set serveroutput on ;/*創建類型*/create or replace type type_flux_data_stat_o as object(ifinoctetsbps number ,ifoutoctetsbps number ,collecttime number);/*創建類型歸屬為表類型*/create or replace type type_flux_data_stat as table of type_flux_data_stat_o;/*pipelined創建函數 返回表類型*/create or replace FUNCTION f_linkgroupstat(begin_time IN NUMBER,end_time IN NUMBER,lg_id in varchar2,table_name varchar2 )return type_flux_data_statpipelined as/*游標申明*/v_Cur SYS_REFCURSOR ;/*sql臨時變量*/v_SQLStatement string (10000 );/*表類型*/v_Table type_flux_data_stat_o;/*流入字節數臨時變量*/tmp_ifinoctetsbps NUMBER ;/*流出字節數臨時變量*/tmp_ifoutoctetsbps NUMBER ;/*流入字節數匯總*/total_ifinoctetsbps NUMBER ;/*流出字節數匯總*/total_ifoutoctetsbps NUMBER ;/*起始時間窗格*/tmp_begin_time NUMBER ;/*結束時間窗格*/tmp_end_time NUMBER ;begin/*時間窗格偏移量為5分鐘(300秒)*/tmp_begin_time := begin_time;tmp_end_time := begin_time + 300 ;total_ifinoctetsbps := 0 ;total_ifoutoctetsbps := 0 ;loopexit when tmp_begin_time > end_time;v_SQLStatement := 'select sum(ifinoctetsbps) ifinoctetsbps,sum(ifoutoctetsbps) ifoutoctetsbps from ' ||table_name ||' a where exists (select 1 from tm_linkgroup_cportdirection b where a.getway = b.getway and a.port_info=b.ifindex_info and lg_id in (' ||lg_id ||') and a.device_id = b.device_id ) and a.collecttime >=' ||tmp_begin_time || ' and a.collecttime <=' ||tmp_end_time || ' order by collecttime' ;Dbms_Output.put_line(v_SQLStatement);/*針對字符串sql打開游標*/open v_Cur for v_SQLStatement;tmp_begin_time := tmp_begin_time + 300 ;tmp_end_time := tmp_end_time + 300 ;total_ifinoctetsbps := 0 ;total_ifoutoctetsbps := 0 ;loop/*將游標的值放入零食變量中*/fetch v_Curinto tmp_ifinoctetsbps, tmp_ifoutoctetsbps;/*當游標中不存在值時跳出游標*/EXIT WHEN v_Cur% NOTFOUND;total_ifinoctetsbps := total_ifinoctetsbps + tmp_ifinoctetsbps;
total_ifoutoctetsbps := total_ifoutoctetsbps + tmp_ifoutoctetsbps;end loop ;/*單行記錄初始化*/v_Table := type_flux_data_stat_o(total_ifinoctetsbps,total_ifoutoctetsbps,tmp_begin_time);/*將記錄壓入至結果集中*/pipe row (v_Table);/*關閉游標*/close v_Cur;end loop ;Exceptionwhen others thenDbms_Output.put_line( Sqlerrm );end f_linkgroupstat;? 使用方法為table(方法)作為表查詢方式,其間沒有臨時表,形如: select * from table(f_linkgroupstat(1361980800,1362067200,'34','FLUX_DATA_2013_2_28')) a;289 rows selected.Elapsed: 00:00:00.28
?? 執行時間為:28ms
轉載于:https://www.cnblogs.com/sesexxoo/p/6190596.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的oracle pipelined返回值函数 针对数据汇总统计 返回结果集方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: -bash: setup: comman
- 下一篇: 告别学生时代