近期需要一个汇总统计,由于数据太多,数据量太大所以在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 的管道化函数(pipelined function)来返回拆分后的结果。函数内部使用了一个循环来拆分字符串,每次循环都会将拆分后的结果返回给调用者。 最后,我们可以使用这个函数来拆分字符串。例如,...
总之,Pipelined函数作为一种高效的数据处理方式,在Oracle数据库中具有重要的应用价值,特别是在处理大规模数据集时,能够显著提升性能。对于需要优化数据库性能的应用场景来说,掌握Pipelined函数的使用是非常有益...
Oracle管道函数是一种特殊类型的函数,它能够返回一个数据集合,并且能够在函数执行的过程中逐步返回结果,而不仅仅是最后的结果。这种特性使得管道函数非常适合于处理大量数据或者需要逐步展示处理进度的场景。 ##...
该函数返回 `TY_STR_SPLIT` 类型的结果集,即一个可以包含多个字符串的集合。 ```sql CREATE OR REPLACE FUNCTION fn_split(p_str IN VARCHAR2, p_delimiter IN VARCHAR2) RETURN ty_str_split PIPELINED IS j INT...
与普通表函数不同,Pipelined Table Function可以在函数执行的过程中逐行返回结果,而不是一次性返回整个结果集。这种特性使得Pipelined Table Function非常适合处理大量数据的情况,因为它可以减少内存消耗并提高...
关键字PIPELINED表明这是一个oracle管道函数,oracle管道函数的返回值类型必须为集合,在函数中,PIPE ROW语句被用来返回该集合的单个元素,函数以一个空的RETURN 语句结束,以表明它已经完成。 由于管道
管道函数(Pipe-lined Function)是Oracle中一种特殊类型的函数,它可以逐行地返回结果集,类似于查询语句。这使得它在处理大量数据时更为高效,并且可以作为表数据类型的数据源。 #### 创建自定义类型 首先,创建...
Pipelined函数允许结果集逐行返回,无需等待整个查询完成。这种方式通常比使用数组有更高的性能: ```sql CREATE OR REPLACE FUNCTION f_test_pipe(v_deptno IN NUMBER DEFAULT NULL) RETURN t_test_table ...
关键字PIPELINED表明这是一个oracle管道函数,oracle管道函数的返回值类型必须为集合 --创建一个集合接受返回的值 1st.create or replace type type_split as table of varchar2(4000); --创建管道函数 create or ...
本篇文章将详细介绍如何在Oracle中实现一个名为`split`的函数来完成字符串的分割,并将其结果以表的形式返回。 #### 二、Oracle Split函数设计原理 ##### 2.1 数据类型定义 为了能够返回一个表形式的结果,首先...
### Oracle 分隔字符串函数知识点详解 #### 一、Oracle 分隔字符串函数介绍 在 Oracle 数据库中处理字符串是一项常见的需求,特别是在数据清洗、格式转换等场景下。Oracle 提供了一系列强大的字符串处理函数来帮助...
6. **统计函数**:Oracle提供了一系列统计函数,如COUNT用于计算行数,SUM用于求和,AVG用于求平均值,MAX和MIN用于找出最大值和最小值,以及VARiance和Stddev用于计算方差和标准差,帮助分析数据集的特征。...
### Oracle PL/SQL编程最佳实践知识点汇总 #### 概述 - **目标**: 提供一套完整的Oracle PL/SQL编程指导原则。 - **适用对象**: 面向所有使用Oracle数据库进行开发的技术人员。 #### 规范 - **命名规则**: - ...
但是,Oracle提供了类似的功能,可以通过创建自定义的表类型并利用这些类型在函数中构造返回多行数据的结果集。以下是如何在Oracle中实现这一功能的详细步骤: 1. **创建表对象类型**: Oracle中,你需要先定义一...
在Oracle数据库中,由于默认的SQL语法并不支持像JavaScript或.NET框架中那样直接对字符串进行`split`操作,所以在处理批量操作时,需要通过自定义函数来实现类似的功能。这里介绍的方法是创建两个用户自定义函数,即...
在Oracle数据库中,批量...通过自定义这些实用函数,Oracle数据库的批量处理能力得到了显著提升,使得在处理大量字符串数据时更加便捷高效。在实际开发中,这种优化技巧对于提高系统性能和降低资源消耗具有重要意义。
使用`PIPELINED`函数返回结果集,提高数据处理效率。 11. **并发控制**:理解并合理应用乐观锁(ROWVERSION或TIMESTAMP列)和悲观锁(FOR UPDATE子句),平衡并发性和数据一致性。 12. **资源管理**:使用`DBMS_...
首先,创建Oracle函数的基本结构包括函数名、输入参数(如果有的话)、返回类型和函数体。以下是一个简单的示例: ```sql CREATE OR REPLACE FUNCTION simple_function(p_input NUMBER) RETURN NUMBER IS l_result...