oracle为我们提供了非常丰富的聚合函数,如SUM\AVG\MAX等。除此之外,我们还可以编写自己的聚合函数,当然,自定义聚合函数也可以作为分析函数来使用。
自定义聚合函数与oracle内置聚合函数并无太大区别,而且它可以使用任何oracle支持的语言来编写,如PL/SQL\C\C++\JAVA。在本文中,我们以PLSQL为开发语言,尝试编制我们自己的聚合函数。
编制ORACLE支持的自定义聚合函数,自然要依据oracle指定的规则来编写,我们不妨称之为ODCIAggregate规则。下面我们以编写获取组中第二大值的的聚合函数为例,看一下自定义聚合函数的编制过程。
1:首先创建一个OBJECT TYPE
CREATE or REPLACE type secmax_context AS object(
firmax NUMBER, -- 保存最大值,这部分内容根据聚合函数操作的不同,有用户自行设置
secmax NUMBER, -- 保存第二大值,这部分内容根据聚合函数操作的不同,有用户自行设置
--(该步骤是必须的)初始化函数,必须要实现的方法,用于在聚合运算的最开始部分,初始化上下文环境
static FUNCTION ODCIAggregateInitialize(sctx IN OUT secmax_context) RETURN NUMBER,
--(该步骤是必须的)迭代运算函数,oracle依据该函数进行迭代运算,第一个参数为聚合运算的上下文,
--第二个参数为当前需要处理的值,可以为number varchar2等类型,
--在迭代过程中,如果当前值为null,则忽略该次迭代
member FUNCTION ODCIAggregateIterate(self IN OUT secmax_context,value IN NUMBER) RETURN NUMBER,
--(该步骤是必须的,但是在执行过程中,oracle会有选择的执行该步骤)该函数用于合并两个上下文到一个上下文中,在并行和串行环境下均有可能发挥作用
member FUNCTION ODCIAggregateMerge(self IN OUT secmax_context, ctx2 IN secmax_context)RETURN NUMBER,
--(该步骤是必须的)该函数在聚合运算的最后一步运行,用于对结果进行处理并返回处理结果,
--第一个参数为上下文,第二个参数为返回值,可以为number,varchar2等类型
--第三个参数为标识位
member FUNCTION ODCIAggregateTerminate(self IN secmax_context,returnValue OUT NUMBER,flags IN NUMBER) RETURN NUMBER
);
2:实现该OBJECT TYPE
create or replace type body secmax_context is
static function ODCIAggregateInitialize(sctx IN OUT secmax_context) return number is
begin
sctx := secmax_context(0, 0);
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT secmax_context, value IN number) return number is
begin
if value > self.firmax then
self.secmax := self.firmax;
self.firmax := value;
elsif value > self.secmax then
self.secmax := value;
end if;
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self IN secmax_context, returnValue OUT number, flags IN number) return number is
begin
returnValue := self.secmax;
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self IN OUT secmax_context, ctx2 IN secmax_context) return number is
begin
if ctx2.firmax > self.firmax then
if ctx2.secmax > self.firmax then
self.secmax := ctx2.secmax;
else
self.secmax := self.firmax;
end if;
self.firmax := ctx2.firmax;
elsif ctx2.firmax > self.secmax then
self.secmax := ctx2.firmax;
end if;
return ODCIConst.Success;
end;
end;
3:创建聚合函数
CREATE FUNCTION SecMax (input NUMBER) RETURN NUMBER PARALLEL_ENABLE AGGREGATE USING secmax_context;
测试结果:
SQL> select secmax(rownum) from costs;
SECMAX(ROWNUM)
--------------
82111
SQL> select max(rownum) from costs;
MAX(ROWNUM)
-----------
82112
并行执行聚合函数:
与内置函数一样,自定义聚合函数也可以并行执行。并指执行时,首先是各个slave执行聚合运算,然后将结果进行合并,合并是通过ODCIAggregateMerge实现的。下图展示了这个过程:

注意:我们可以将自定义聚合函数作为分析函数使用,但是为了提高分析函数的执行效率,我们可以对自定义聚合函数做一些处理,详细内容可以参考《Data Cartridge Developer's Guide 》
分享到:
相关推荐
Oracle 自定义聚合函数-分析函数 Oracle 自定义聚合函数是一种强大且灵活的功能,允许用户根据自己的需求创建自定义的聚合函数。聚合函数是一种特殊的函数,它可以对一组数据进行处理和计算,并返回一个结果。 ...
Oracle分析函数是数据库管理系统Oracle中的一种高级查询工具,主要用于处理复杂的报表统计和数据分析。它们在OLAP(在线分析处理)系统中尤其重要,因为这类系统往往需要处理大量数据并进行复杂的聚合计算,而分析...
从提供的文件名称来看,"oracle分析函数.doc"很可能是对Oracle分析函数的详细讲解,涵盖各种函数的用法和实例;"2.Oracle_9i10g_PLSQL编程详细(350页).pdf"可能是一部全面介绍PL/SQL编程的教程,覆盖了从基础到高级...
5. **聚合函数** - `COUNT()`:计算行数。 - `SUM()`:计算数值列的总和。 - `AVG()`:计算平均值。 - `MAX()` 和 `MIN()`:找到最大值和最小值。 6. **分组和排序函数** - `GROUP BY`:根据一个或多个列对...
Oracle分析函数是数据库查询中的一个重要工具,主要用于处理复杂的分组和排序数据,提供了一种高效的方式来计算基于数据集的聚合信息。在OLAP(在线分析处理)系统中,分析函数尤其重要,因为它们能帮助用户在大数据...
### ORACLE报表分析利剑——分析函数:深度解析与应用 #### 一、理解分析函数:数据统计的新维度 分析函数作为Oracle数据库中一项高级功能,专为解决复杂报表统计需求设计,其核心优势在于能够对数据进行精细的...
* 还有一部分分析函数不会对同一组中的数据进行处理(例如:sum()、listagg()),这种情况下,分析函数返回的数据会有重复的,distinct 处理之后的结果与对应的聚合函数返回的结果一致。 在使用 LISTAGG 函数时,...
通过这种方式,我们可以看到,Oracle自定义聚集函数提供了一种强大的工具,使开发人员能够根据特定需求定制数据聚合逻辑,从而更好地满足复杂业务场景下的数据分析需求。无论是处理简单的数值统计,还是复杂的权限...
4. **聚合函数**: - `COUNT()`: 计算一组值的数量。 - `SUM()`: 计算一组值的总和。 - `AVG()`: 计算一组值的平均值。 - `MAX()`: 找出一组值的最大值。 - `MIN()`: 找出一组值的最小值。 5. **转换函数**: ...
4. **聚合函数与分析函数**: - 分组函数如COUNT、SUM、AVG、MAX、MIN在GROUP BY子句中使用,对分组数据进行计算。 - 分析函数如ROW_NUMBER、RANK、DENSE_RANK、LAG、LEAD等,用于窗口查询,提供行间计算功能。 5...
在Oracle数据库系统中,内置函数分为多种类型,包括数值函数、字符串函数、日期时间函数、转换函数、数学函数、聚合函数等。下面将详细介绍这些函数类别及其常见用法。 1. **数值函数**: - `ABS()`:返回一个数的...
这些只是Oracle函数的一小部分,Oracle还提供了许多其他高级功能,如窗口函数、分析函数、集合函数等,它们在数据处理和分析中起着至关重要的作用。通过深入学习和熟练运用这些函数,可以极大地提高在Oracle数据库...
`wm_concat`函数用于聚合查询结果,实现多行数据的合并: ```sql SELECT WM_CONCAT(ENAME) FROM EMP; ``` ### 三、数据类型转换函数 #### 1. to_char `to_char`函数将日期或数字转换为字符串,支持自定义格式化: ...
此外,Oracle SQL还提供了一些高级函数,如聚合函数(如`SUM`, `AVG`, `COUNT`)和窗口函数(如`LEAD`, `LAG`, `RANK`),这些函数在数据分析和报表生成中非常有用。 在实际应用中,了解并熟练使用这些内置函数可以...
对于初学者来说,建议从基础函数开始学习,如数据类型转换和简单的算术运算,然后逐步进阶到更复杂的函数,如窗口函数和自定义聚合函数。同时,理解每个函数的工作原理和适用场景至关重要,这可以通过阅读文档中的...
7. 存储过程还包含了一个异常处理部分,当发生其他未预期的错误时,会抛出一个自定义的应用程序错误。 通过这个存储过程,用户可以灵活地将多行数据按日期差转换为列,便于分析特定活动在不同时间周期内的工作项...
还有聚合函数如SUM、AVG、COUNT等用于统计分析。 通过学习这些内容,你可以掌握如何利用PL_SQL进行高效的数据查询和更新,编写复杂的业务逻辑,以及如何利用Oracle的丰富函数进行数据处理。对于数据库管理员、开发...
选项中ROWID和ROWNUM是Oracle的伪列,ROW_NUMBER()是分析函数的一部分,而不是伪列;LEVEL用于连接查询中的层次遍历;COLUMN不是一个伪列。因此正确答案为AD。 **7. 当表的重复行数据很多时,应该创建的索引类型...
Oracle 10gR2 包含了许多内置的分析函数,如 AVG、COUNT、MAX、MIN、SUM、RANK 等,同时也支持用户自定义的分析函数。 分析函数的基本格式如下: Analytic-Function (Argument, Argument, ...) OVER (Query-...
创建自定义聚合函数的步骤大致如下: 1. **创建类型**:首先,你需要创建一个PL/SQL记录类型,该类型可以存储你要聚合的列的数据。 2. **创建聚合状态类型**:这是一个PL/SQL类型的变量,用于在聚合过程中存储中间...