本文基本上是对Orace文档(http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14289/dciaggfns.htm#sthref542) 的翻译。

 

Oracle提供了很多预定义好的聚集函数,比如Max(), Sum(), AVG(), 但是这些预定义的聚集函数基本上都是适应于标量数据(scalar data), 对于复杂的数据类型,比如说用户自定义的Object type, Clob等, 是不支持的。

但是,幸运的是, 用户可以通过实现Oracle的Extensibility Framework中的ODCIAggregate interface来创建自定义聚集函数,而且自定义的聚集函数跟内建的聚集函数用法上没有差别。

 

ODCI是Oracle Data Cartridge Interface 几个单词的首字母缩写, 关于Oracle Data Cartridge,可以参见这里

 

 

1. Overview of User-Defined Aggregate Functions

 

通过实现ODCIAggregate rountines来创建自定义的聚集函数。可以通过定义一个对象类型(Object Type),然后在这个类型内部实现ODCIAggregate 接口函数(routines), 可以用任何一种Oracle支持的语言来实现这些接口函数,比如C/C++, JAVA, PL/SQL等。在这个Object Type定义之后,相应的接口函数也都在该Object Type Body内部实现之后, 就可以通过CREATE FUNCTION语句来创建自定义的聚集函数了。

 

每个自定义的聚集函数需要实现4个ODCIAggregate 接口函数, 这些函数定义了任何一个聚集函数内部需要实现的操作,这些函数分别是 initialization, iteration, merging 和 termination。

 

(1) ODCIAggregateInitialize 这个函数用来执行初始化操作(initialization). Oracle会调用这个函数来初始化自定义函数计算。 初始化的聚集环境(aggregation context)会以对象实例(object type instance)传回给oracle.

 

(2) ODCIAggregateIterate 这个函数用来遍历需要处理的数据,被oracle重复调用。每次调用的时候,当前的aggreation context 和 新的(一组)值会作为传入参数。 这个函数会处理这些传入值,然后返回更新后的aggregation context. 这个函数对每一个NON-NULL的值都会被执行一次。NULL值不会被传递个聚集函数。

 

(3) ODCIAggregateMerge 这个函数用来把两个aggregation context整合在一起,一般用来并行计算中(当一个函数被设置成enable parallel 处理的时候)。

 

(4) ODCIAggregateTerminate 这个函数是Oracle调用的最后一个函数。它接收aggregation context作为参数,返回最后的aggregate value.

 

 

Example: 自定义聚集函数是如何工作的

SELECT AVG(T.Sales)
FROM AnnualSales T
GROUP BY T.State;

相关文章: