oracle+interval+second,Oracle自定义聚合函数之Interval To Second平均值

由于项目需要,在网上查了很多资料,没有找到有关求Interval To Second类型字段平均值的文章,于是我自己动手实现了这个功能。

一、创建Oracle Type: day_to_second_avg_type

create or replace type day_to_second_avg_type as object

( total interval day(9) to second(2), --参数1,用于做Sum运算

dataCount number, --参数2,统计数据库记录的总数

--初始化函数,用于初始化上下文环境

static function ODCIAggregateinitialize(sctx in out day_to_second_avg_type) return number,

--迭代函数,聚合操作正是在此进行

member function ODCIAggregateIterate(self IN OUT day_to_second_avg_type,value IN total%type) return number,

--Merge函数,用于并行和串行环境,合并两个环境的上下文信息

member function ODCIAggregateMerge(self IN OUT day_to_second_avg_type,ctx2 IN day_to_second_avg_type) return number,

--返回值的函数,在此做最后的加工处理

member function ODCIAggregateTerminate(self IN day_to_second_avg_type,returnValue OUT total%type,flags IN number) return number

);

/

--实现:初始化函数,用于初始化上下文环境

create or replace type body day_to_second_avg_type is

static function ODCIAggregateInitialize(sctx IN OUT day_to_second_avg_type) return number is

begin

sctx:= day_to_second_avg_type(numtodsinterval( 0,'SECOND'), 0); --初始化

return ODCIConst.Success;

end;

--实现:迭代函数,聚合操作正是在此进行

member function ODCIAggregateIterate(self IN OUT day_to_second_avg_type,value IN total%type) return number is

begin

self.total:=self.total+value; --字段值累加

self.dataCount:= self.dataCount+1; --统计字段个数

return ODCIConst.Success;

end;

--实现:Merge函数,用于并行和串行环境,合并两个环境的上下文信息

member function ODCIAggregateMerge(self IN OUT day_to_second_avg_type,ctx2 IN day_to_second_avg_type) return number is

begin

self.total:=self.total+ctx2.total; --合并

self.dataCount:= self.dataCount+ctx2.dataCount; --合并

return ODCIConst.Success;

end;

--实现:返回值的函数,在此做最后的加工处理

member function ODCIAggregateTerminate(self IN day_to_second_avg_type,returnValue OUT total%type,flags IN number) return number is

begin

returnValue:=self.total / self.dataCount; --interval day(9) to second(2)类型字段的统计Sum / 该字段个数

return ODCIConst.Success;

end;

end;

二、创建一个测试用视图

CREATE OR REPLACE VIEW view_test_interval AS

SELECT INTERVAL '2 01:23:16.3312' DAY(9) TO SECOND AS interval_col FROM DUAL union

SELECT INTERVAL '6 02:12:14.3312' DAY(9) TO SECOND AS interval_col FROM DUAL union

SELECT INTERVAL '3 04:20:23.3312' DAY(9) TO SECOND AS interval_col FROM DUAL union

SELECT INTERVAL '1 02:16:22.3312' DAY(9) TO SECOND AS interval_col FROM DUAL union

SELECT INTERVAL '9 02:12:11.3312' DAY(9) TO SECOND AS interval_col FROM DUAL;

三、创建一个函数并测试使用

CREATE OR REPLACE FUNCTION ds_avg(input view_test_interval.interval_col%type) RETURN view_test_interval.interval_col%type

PARALLEL_ENABLE AGGREGATE USING day_to_second_avg_type;

/

select ds_avg(interval_col) from view_test_interval;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值