近期需要一个汇总统计,由于数据太多,数据量太大所以在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返回值函数 针对数据汇总统计 返回结果集方法的更多相关文章

  1. c语言进阶4-有返回值函数

    一.         从函数返回 从函数返回就是返回语句的第一个主要用途.在程序中,有两种方法可以终止函数的执行,并返回到调用函数的位置.第一种方法是在函数体中,从第一句一直执行到最后一句,当所有语句 ...

  2. c++中带返回值函数没写return能通过编译但运行时会出现奇怪问题

    c++中带返回值函数没写return能通过编译但运行时会出现奇怪问题 例如: string myFunc(){ theLogics(); } 发现调用: myFunc(); 崩溃. 但调用: cout ...

  3. go语言基础之有参有返回值函数的使用

    1.有参有返回值函数的使用 示例1: package main //必须 import "fmt" //go官方推荐写法 func MaxAndMin(a, b int) (max ...

  4. Python函数01/函数的初识/函数的定义/函数调用/函数的返回值/函数的参数

    Python函数01/函数的初识/函数的定义/函数调用/函数的返回值/函数的参数 内容大纲 1.函数的初识 2.函数的定义 3.函数的调用 4.函数的返回值 5.函数的参数 1.函数初识 # def ...

  5. c语言main函数返回值、参数详解(返回值是必须的,0表示正常退出)

    C语言Main函数返回值 main函数的返回值,用于说明程序的退出状态.如果返回0,则代表程序正常退出:返回其它数字的含义则由系统决定.通常,返回非零代表程序异常退出. 很多人甚至市面上的一些书籍,都 ...

  6. SpringMVC入门(二)—— 参数的传递、Controller方法返回值、json数据交互、异常处理、图片上传、拦截器

    一.参数的传递 1.简单的参数传递 /* @RequestParam用法:入参名字与方法名参数名不一致时使用{ * value:传入的参数名,required:是否必填,defaultValue:默认 ...

  7. C++获取Lua全局变量和执行Lua多参数多返回值函数

    C++代码: // LuaAndC.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #i ...

  8. SpringMVC(二)返回值设置、数据在域中的保存与SpringMVC案例

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.返回值的设置 1.返回 String [1]返回 String 默认情况 @RequestMappi ...

  9. ASP.Net MVC 在ajax接收controller返回值为Json数据

    首先,再次回忆一下ajax的标准用法:(这张图写的比较详细了)(转) 页面部分ajax代码: $.ajax({            url: "/Home/Login?account=&q ...

随机推荐

  1. 浅谈单片机、ARM和DSP的异同

    犹记得当年读书的时候,老师说单片机.ARM.DSP有互通之处,都是CPU,但听老师讲都听不懂. 我该如何理解他们,并找出他们的异同呢?我们来看看行内人的看法: ICer,从事ARM CPU的SOC设计 ...

  2. bzoj1786

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1786 刚看上去觉得挺吓人的...... 冥冥之中我的内心深处告诉我填进去的数一定是非严格递增的 ...

  3. TortoiseGit 使用教程

    原文地址:http://blog.csdn.net/ethan_xue/article/details/7749639 git的使用越来越广泛 使用命令比较麻烦,下面讲解一下tortoisegit的使 ...

  4. Asp.Net 构架(Http Handler 介绍) - Part.2

    原文地址:http://www.cnblogs.com/JimmyZhang/archive/2007/09/15/894124.html 引言 在 Part.1 Http请求处理流程 一文中,我们了 ...

  5. Codeforce 219 div1

    B 4D"部分和"问题,相当于2D部分和的拓展,我是分解成2D部分和做的: f[x1][y1][x2][y2]=true/false 表示 左上(x1,y1) 右下(x2,y2)的 ...

  6. html5+css3中的background: -moz-linear-gradient 用法 (转载)

    转载至-->http://www.cnblogs.com/smile-ls/archive/2013/06/03/3115599.html 在CSS中background: -moz-linea ...

  7. 域名地址默认跳转到www(301重定向)

    要做这个操作之前,你首先必须肯定要有一个域名..... 然后域名指向了某一个外网主机地址,能正常访问网站 IIS7之后版本的看客继续往下看,IIS7之前的版本,请止步,我没有对之前的版本做过 首先确认 ...

  8. JavaScript 滚动页面到指定元素位置

    页面评论功能,当评论较多时,有时须要滚动到评论头部. 能够使用scrollTop方法,加上一点延时动画(animate),可訪问在线演示,代码大体例如以下: <html> <scri ...

  9. git 学习笔记一

    1.git的 介绍 分布式和 集中式 集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟, ...

  10. C#调用VB6写的ActiveX Dll

    搜索了很多资料,下载了Demo:http://download.csdn.net/detail/xieguoxian/2747484然后在同学电脑上测试才弄好...记录下 (一) 前期搜索资料: VB ...