日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle pipelined返回值函数 针对数据汇总统计 返回结果集方法

發布時間:2024/4/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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返回值函数 针对数据汇总统计 返回结果集方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。