`
xiamizy
  • 浏览: 92158 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
78437efc-ad8e-387c-847f-a092d52e81a6
spring framew...
浏览量:4940
社区版块
存档分类
最新评论

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_stat
 
pipelined 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 ;
 
loop
 
exit 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_Cur
 
into 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 ;
 
Exception
 
when others then
 
Dbms_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
分享到:
评论

相关推荐

    Oracle中实现Split函数功能

    这个函数使用了 Oracle 的管道化函数(pipelined function)来返回拆分后的结果。函数内部使用了一个循环来拆分字符串,每次循环都会将拆分后的结果返回给调用者。 最后,我们可以使用这个函数来拆分字符串。例如,...

    Pipelined 是Oracle的一个关键字

    总之,Pipelined函数作为一种高效的数据处理方式,在Oracle数据库中具有重要的应用价值,特别是在处理大规模数据集时,能够显著提升性能。对于需要优化数据库性能的应用场景来说,掌握Pipelined函数的使用是非常有益...

    oracle管道函数用法

    Oracle管道函数是一种特殊类型的函数,它能够返回一个数据集合,并且能够在函数执行的过程中逐步返回结果,而不仅仅是最后的结果。这种特性使得管道函数非常适合于处理大量数据或者需要逐步展示处理进度的场景。 ##...

    PostgreSQL 管道函数(Pipelined Table Function)——兼容oracle

    关键字PIPELINED表明这是一个oracle管道函数,oracle管道函数的返回值类型必须为集合,在函数中,PIPE ROW语句被用来返回该集合的单个元素,函数以一个空的RETURN 语句结束,以表明它已经完成。 由于管道

    详解oracle管道函数的用法(一行拆为多行)

    关键字PIPELINED表明这是一个oracle管道函数,oracle管道函数的返回值类型必须为集合 --创建一个集合接受返回的值 1st.create or replace type type_split as table of varchar2(4000); --创建管道函数 create or ...

    Oracle PLSQL编程最佳实践中文版

    ### Oracle PL/SQL编程最佳实践知识点汇总 #### 概述 - **目标**: 提供一套完整的Oracle PL/SQL编程指导原则。 - **适用对象**: 面向所有使用Oracle数据库进行开发的技术人员。 #### 规范 - **命名规则**: - ...

    PLSQL最佳实践

    - 特别适用于处理游标返回的结果集。 - 示例:`BEGIN FOR c_employee IN (SELECT * FROM employees) LOOP DBMS_OUTPUT.PUT_LINE(c_employee.name); END LOOP; END;` **3.12.4 WHILE循环** - 示例:`WHILE v_counter...

Global site tag (gtag.js) - Google Analytics