`

自定义Oracle聚集函数:模拟SUM,MAX,AVG

阅读更多

实现三个函数,关键都在于处理ODCIAggregateIterate(),即下面几张图中的高亮部分。Oracle自定义聚集函数的功能很强大,笔者暂时只钻研到这一层。

f_sum(),模拟SUM()函数:

定义TYPE:

create or replace type f_sum_type2 as object (
num number,
static function ODCIAggregateInitialize(sctx In Out f_sum_type2) return number,
member function ODCIAggregateIterate(self In Out f_sum_type2, value In number) return number,
member function ODCIAggregateMerge(self In Out f_sum_type2, ctx2 In f_sum_type2) return number,
member function ODCIAggregateTerminate(self In Out f_sum_type2, returnValue Out number, flags In number) return number
)

定义TYPE BODY:

 

create or replace type body f_sum_type2
is

static function ODCIAggregateInitialize (sctx In Out f_sum_type2)
return number is
begin
sctx := f_sum_type2(0);
return ODCIConst.Success;
end;

member function ODCIAggregateIterate (self In Out f_sum_type2, value In number)
return number is
begin
self.num := self.num + value;
return ODCIConst.Success;
end;

member function ODCIAggregateMerge(self In Out f_sum_type2, ctx2 In f_sum_type2)
return number is
BEGIN
self.num := self.num;
return ODCIconst.Success;
end;

member function ODCIAggregateTerminate(self In Out f_sum_type2, returnValue Out number, flags In number)
return number is
begin
returnValue := self.num;
return ODCIConst.Success;
end;

end;

定义函数:

 

CREATE OR REPLACE FUNCTION f_sum2(input number )
RETURN number
PARALLEL_ENABLE AGGREGATE USING f_sum_type2;

测试:

 

SQL> select f_sum2(id),sum(id) from "tblabc"
2 ;

F_SUM2(ID) SUM(ID)
---------- ----------
5247 5247

SQL>

 

f_max(),模拟MAX()函数:

定义TYPE:

 

CREATE OR REPLACE TYPE f_max_type AS OBJECT
(
var NUMBER,
STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT f_max_type) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateIterate(SELF IN OUT f_max_type, VALUE IN NUMBER) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateMerge(SELF IN OUT f_max_type, ctx2 IN OUT f_max_type) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateTerminate(SELF IN OUT f_max_type, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER

)

定义TYPE BODY:

 

CREATE OR REPLACE TYPE BODY f_max_type IS

STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT f_max_type)
RETURN NUMBER IS
BEGIN
sctx := f_max_type(0);
RETURN ODCIConst.Success;
END;

MEMBER FUNCTION ODCIAggregateIterate(SELF IN OUT f_max_type, VALUE IN NUMBER)
RETURN NUMBER IS
BEGIN
IF SELF.var < VALUE THEN
SELF.var := VALUE;
END IF;

RETURN ODCIConst.Success;
END;

MEMBER FUNCTION ODCIAggregateMerge(SELF IN OUT f_max_type, ctx2 IN OUT f_max_type)
RETURN NUMBER IS
BEGIN
RETURN ODCIConst.Success;
END;

MEMBER FUNCTION ODCIAggregateTerminate(SELF IN OUT f_max_type, returnValue OUT NUMBER, flags IN NUMBER)
RETURN NUMBER IS
BEGIN
returnValue := SELF.var;
RETURN ODCIconst.success;
END;

END;

 

CREATE OR REPLACE FUNCTION f_max (input NUMBER)
RETURN NUMBER
PARALLEL_ENABLE AGGREGATE USING f_max_type;

 

SQL> select f_max(id),max(id) from "tblabc"
2 ;

F_MAX(ID) MAX(ID)
---------- ----------
303 303

SQL>

f_avg(),模拟AVG()函数:

定义TYPE:

 

CREATE OR REPLACE TYPE f_avg_type AS OBJECT
(
SUM NUMBER, num NUMBER,
STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT f_avg_type) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateIterate(SELF IN OUT f_avg_type, VALUE IN NUMBER) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateMerge(SELF IN OUT f_avg_type, ctx2 IN f_avg_type) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateTerminate(SELF IN OUT f_avg_type, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER
)

定义TYPE BODY:

 

 

CREATE OR REPLACE TYPE BODY f_avg_type
IS

STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT f_avg_type)
RETURN NUMBER IS
BEGIN
sctx := f_avg_type(0, 0);
RETURN ODCICONST.Success;
END;

MEMBER FUNCTION ODCIAggregateIterate (SELF IN OUT f_avg_type, VALUE IN NUMBER)
RETURN NUMBER IS
BEGIN
SELF.SUM := SELF.SUM + VALUE;
SELF.num := SELF.num + 1;

RETURN ODCIConst.Success;
END;

MEMBER FUNCTION ODCIaggregateMerge(SELF IN OUT f_avg_type, ctx2 IN f_avg_type)
RETURN NUMBER IS
BEGIN
RETURN ODCIConst.Success;
END;

MEMBER FUNCTION ODCIAggregateTerminate(SELF IN OUT f_avg_type, returnValue OUT NUMBER, flags IN NUMBER)
RETURN NUMBER IS
BEGIN
returnValue := SELF.SUM/SELF.num;
RETURN ODCIConst.Success;
END;

END;

定义函数:

 

CREATE OR REPLACE FUNCTION f_avg(input NUMBER)
RETURN NUMBER
PARALLEL_ENABLE AGGREGATE USING f_avg_type;

测试:

 

SQL> select f_avg(id),avg(id) from "tblabc"
2 ;

F_AVG(ID) AVG(ID)
---------- ----------
276.157895 276.157895

分享到:
评论

相关推荐

    oracle系统内置函数大全

    Oracle数据库系统内置了大量函数,这些函数可以分为多个类别,例如字符函数、数字函数、日期函数、转换函数、分组函数以及其他辅助函数等。以下是对每个类别中一些常用函数的详细介绍: 字符函数 1. ASCII函数:...

    oracle函数大全 oracle函数大全

    除了上述函数,Oracle还提供其他很多函数,如TO_DATE用于将字符串转换为日期,TO_CHAR用于将日期转换为字符串,NVL用于处理NULL值,以及COUNT、SUM、AVG、MAX、MIN等聚合函数。了解并熟练使用这些函数,能极大地提高...

    oracle 函数大全 参考函数 手册 速查 chm格式

    6. 聚合函数:如COUNT(计数)、SUM(求和)、AVG(平均值)、MAX/MIN(最大值/最小值)等,用于汇总数据。 7. 位操作函数:如BITAND(按位与)、BITOR(按位或)、BITNOT(按位非)等,处理二进制数据。 8. 非...

    oracle内置函数大全

    Oracle数据库是世界上最广泛使用的数据库系统之一,其内置函数是实现高效数据处理的关键工具。这篇文档“oracle内置函数大全”提供了一个全面的参考,适合数据库管理员、开发人员以及初学者使用。下面将详细介绍...

    oracle分析函数.doc

    - 移动聚合函数:`SUM()`, `AVG()`, `MIN()`, `MAX()`等,在分析窗口内进行聚合计算。 - 移动平均:如`LEAD()`, `LAG()`, `CUME_DIST()`,提供向前或向后查看数据的能力,以及累积分布。 2. **Oracle分析函数简单...

    ORACLE分析函数

    常见的分析函数包括`SUM()`, `COUNT()`, `AVG()`, `MIN()`, `MAX()`等,它们通常与`OVER`子句一起使用来定义计算范围。 ### SUM() OVER 的不同用法 #### 按部门“连续”求总和 ```sql SUM(sal) OVER (PARTITION BY...

    Oracle分析函数

    Oracle 分析函数详解 Oracle 分析函数是 Oracle 数据库中的一种强大功能,能够帮助用户快速进行数据分析和处理。在本文中,我们将对 Oracle 分析函数进行详细的介绍,并对其各个函数进行解释。 一、总体介绍 ...

    oracle 10G函数大全(中文)

    - 分组函数如COUNT、SUM、AVG、MAX、MIN在GROUP BY子句中使用,对分组数据进行计算。 - 分析函数如ROW_NUMBER、RANK、DENSE_RANK、LAG、LEAD等,用于窗口查询,提供行间计算功能。 5. **连接和比较函数**: - ...

    Oracle的110个自带函数总结归纳

    Oracle数据库是世界上最广泛使用的数据库系统之一,其强大的功能和丰富的内置函数是其核心优势之一。在Oracle中,函数用于处理各种类型的数据,包括数学运算、字符串处理、日期时间操作、逻辑判断等。以下是对...

    ORACLE分析函数教程

    这些函数可以应用于数据的一个特定窗口上,常见的函数有`SUM()`, `COUNT()`, `AVG()`, `MIN()`, `MAX()`等。 ```sql -- 示例:计算每个部门的薪水总和 SELECT employee_id, salary, department_id, SUM(salary)...

    【转】Oracle分析函数简述

    Oracle分析函数是数据库管理系统Oracle中的一种高级查询工具,它们在SQL查询中用于处理集合数据,提供了对一组行进行计算的能力,而不仅仅局限于单行或单列。这些函数使得数据库管理员和开发人员能够进行复杂的统计...

    oracle函数大全中文

    聚组函数在SQL查询中用于汇总数据,如`COUNT`计数,`SUM`求和,`AVG`计算平均值,`MIN`和`MAX`找出最小和最大值,以及`GROUP BY`语句配合使用这些函数进行分组。 6. 分析函数: 分析函数允许在数据分组后进行更复杂...

    Oracle函数列表速查

    组函数包括SUM、AVG、COUNT、MIN、MAX等,它们通常用于聚合查询,以提供更高级别的数据总结。组函数可以配合GROUP BY子句使用,以便对每个组执行计算。 以下是一些使用Oracle函数的示例: ```sql SELECT ename, TO...

    oracle 110个常用函数.zip

    6. 集合函数:COUNT(), SUM(), AVG(), MAX(), MIN()用于统计和聚合数据。 7. 分组和窗口函数:GROUP BY用于分组数据,RANK(), DENSE_RANK(), ROW_NUMBER()用于排序和排名,LEAD()和LAG()获取相邻行的值。 8. 模式...

    oracle语法及常用命令

    * Oracle 函数:SUM 函数、AVG 函数、MAX 函数、MIN 函数等 * Oracle 角色和权限:CREATE USER 语句、GRANT 语句、REVOKE 语句等 * Oracle 表管理:CREATE TABLE 语句、ALTER TABLE 语句、DROP TABLE 语句等 八、...

    oracle常用函数chm版

    如`COUNT`统计行数,`SUM`求和,`AVG`计算平均值,`MAX`和`MIN`分别找出最大和最小值。这些函数常在SQL查询的GROUP BY语句中使用,进行数据汇总。 6. **分析函数**:分析函数在处理大量数据时非常有用,如`RANK`、`...

    oracle分组函数(ppt文档).ppt

    Oracle 提供了多种分组函数,包括 AVG、SUM、MIN、MAX、COUNT 等。这些函数可以单独使用,也可以组合使用以实现复杂的数据分析。 分组函数的基本语法为: ```sql SELECT column, group_function(column), ... FROM...

    Oracle函数速查手册

    7. 聚合函数:在处理集合数据时,聚合函数非常有用,如`COUNT()`计算记录数量,`SUM()`求和,`AVG()`计算平均值,`MAX()`和`MIN()`找出最大值和最小值。 除了上述函数,Oracle还有许多其他高级功能,如窗口函数、...

Global site tag (gtag.js) - Google Analytics