一个Oracle自定义聚集函数的例子

前天有人提了需求,想对某个字段进行按位的或操作。本来建议查询出来之后在应用程序里面处理,但是数据量比较大,觉得还是返回一个分组计算之后的值比较合适。

 

两个问题,一个是按为或的操作,这个参考了别人的文档,用bitand函数实现。 原文如下:

http://blog.chinahr.com/blog/hewy0526/post/112968

 

然后就是自定义的聚集函数了。这个参考了官方文档的例子,就不列出原文出处了。

 

全部代码如下:

 

-- 1. Implement the type BitOrImpl to contain the ODCIAggregate routines:
create type BitOrImpl as object
(
  bitorval NUMBER, -- result.
  static function ODCIAggregateInitialize(sctx IN OUT BitOrImpl)
    return number,
  member function ODCIAggregateIterate(self IN OUT BitOrImpl,
    value IN number) return number,
  member function ODCIAggregateTerminate(self IN BitOrImpl,
    returnValue OUT number, flags IN number) return number,
  member function ODCIAggregateMerge(self IN OUT BitOrImpl,
    ctx2 IN BitOrImpl) return number
);
/

-- 2. mplement the type body for BitOrImpl:
create or replace type body BitOrImpl is
static function ODCIAggregateInitialize(sctx IN OUT BitOrImpl)
return number is
begin
  sctx := BitOrImpl(0);
  return ODCIConst.Success;
end;

member function ODCIAggregateIterate(self IN OUT BitOrImpl, value IN number) return number is
begin
  self.bitorval := (self.bitorval + value) - bitand(self.bitorval, value);
  return ODCIConst.Success;
end;

member function ODCIAggregateTerminate(self IN BitOrImpl,
    returnValue OUT number, flags IN number) return number is
begin
  returnValue := self.bitorval;
  return ODCIConst.Success;
end;

member function ODCIAggregateMerge(self IN OUT BitOrImpl, ctx2 IN BitOrImpl) return number is
begin
  self.bitorval := (self.bitorval + ctx2.bitorval) - bitand(self.bitorval, ctx2.bitorval);
  return ODCIConst.Success;
end;
end;
/

-- 3. Create the user-defined aggregate:
CREATE FUNCTION BitOr (input NUMBER) RETURN NUMBER
PARALLEL_ENABLE AGGREGATE USING BitOrImpl;
/

测试通过。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值