一个Oracle自定义聚集函数的例子
2009-12-24 10:16
531 查看
前天有人提了需求,想对某个字段进行按位的或操作。本来建议查询出来之后在应用程序里面处理,但是数据量比较大,觉得还是返回一个分组计算之后的值比较合适。
两个问题,一个是按为或的操作,这个参考了别人的文档,用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;
/
测试通过。
两个问题,一个是按为或的操作,这个参考了别人的文档,用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;
/
测试通过。
相关文章推荐
- [收藏]在oracle里定义一个自定义字符串的聚集函数
- 对字符串的“sum”——在Oracle中自定义聚集函数的例子
- 对字符串的“sum”——在Oracle中自定义聚集函数的例子
- 用一个实例讲解Oracle的自定义聚集函数
- 关于oracle9以上自定义聚集函数的例子
- 对字符串的“sum”——在Oracle中自定义聚集函数的例子
- 对字符串的“sum”——在Oracle中自定义聚集函数的例子
- 对字符串的“sum”——在Oracle中自定义聚集函数的例子
- Oracle自定义聚集函数
- Oracle自定义聚集函数
- Oracle 的一个非常好的触发器例子
- Oracle自定义的聚集函数的强大功能
- 一个统计Oracle中所有应用表记录数的例子
- Flex:在LineChart图表中创建一个自定义的LinearAxis函数标签(Tip提示)的例子
- 8.4 自定义 Git - 使用强制策略的一个例子
- 自定义规则排序数组的一个例子
- oracle 抛出自定义错误(网上找的例子)
- 一个自定义函数的例子
- [Oracle]Plsql的一个例子
- IOS:最简单一个使用自定义的TableViewCell例子