---
title: "创建用户自定义聚合函数 - OceanBase 数据库 V4.4.0 | OceanBase 文档中心"
description: 创建用户自定义聚合函数 创建用户定义聚合函数的过程包括实现 ODCIAggregate 接口和定义用户自定义聚合函数两个步骤。 功能适用性 该内容仅适用于 OceanBase 数据库企业版。OceanBase 数据库社区版仅提供 MySQL 模式。 本文以 SecMax() 为例，详细介绍如何创建用户自定义聚合函数。…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.4.0

# 创建用户自定义聚合函数

更新时间：2025-09-08 16:00:42

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.4.0/zh-CN/700.reference/600.pl-reference/300.pl-oracle/700.stored-procedure-and-functions-oracle/700.user-defined-aggregation-functions-oracle/300.create-a-user-defined-aggregate-function-oracle.md)  

创建用户定义聚合函数的过程包括实现 `ODCIAggregate` 接口和定义用户自定义聚合函数两个步骤。

#### 功能适用性

该内容仅适用于 OceanBase 数据库企业版。OceanBase 数据库社区版仅提供 MySQL 模式。

本文以 `SecMax()` 为例，详细介绍如何创建用户自定义聚合函数。`SecMax()` 用于返回一组数字中的第二大值。

1. 实现 `ODCIAggregate` 接口

   `ODCIAggregate` 例程是作为对象类型 `SecMaxImpl` 中的方法来实现的。

   ```javascript
   /*实现类型 SecMaxImpl 以包含 ODCIAggregate 例程*/
   CREATE OR REPLACE TYPE SecMaxImpl AS OBJECT
   (
     max NUMBER,   -- 当前最大值
     secmax NUMBER, -- 当前第二大值
     STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT SecMaxImpl) RETURN NUMBER,
     MEMBER FUNCTION ODCIAggregateIterate(self IN OUT SecMaxImpl, value IN number) RETURN NUMBER,
     MEMBER FUNCTION ODCIAggregateTerminate(self IN SecMaxImpl, returnValue OUT number, flags IN number) RETURN NUMBER,
     MEMBER FUNCTION ODCIAggregateMerge(self IN OUT SecMaxImpl, ctx2 IN SecMaxImpl) RETURN NUMBER
   );
   /

   /*实现 SecMaxImpl 的类型主体*/
   CREATE OR REPLACE TYPE BODY SecMaxImpl IS
   STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT SecMaxImpl)
   RETURN NUMBER IS
   BEGIN
     sctx := SecMaxImpl(0, 0);
     RETURN ODCIConst.Success;
   END;

   MEMBER FUNCTION ODCIAggregateIterate(self IN OUT SecMaxImpl, value IN number) RETURN NUMBER IS
   BEGIN
     IF value > self.max THEN
       self.secmax := self.max;
       self.max := value;
     ELSIF value > self.secmax THEN
       self.secmax := value;
     END IF;
     RETURN ODCIConst.Success;
   END;

   MEMBER FUNCTION ODCIAggregateTerminate(self IN SecMaxImpl,
       returnValue OUT number, flags IN number) RETURN NUMBER IS

   BEGIN
     returnValue := self.secmax;
     RETURN ODCIConst.Success;
   end;

   MEMBER FUNCTION ODCIAggregateMerge(self IN OUT SecMaxImpl, ctx2 IN SecMaxImpl) RETURN NUMBER IS
   BEGIN
     IF ctx2.max > self.max THEN
       IF ctx2.secmax > self.secmax THEN
         self.secmax := ctx2.secmax;
       ELSE
         self.secmax := self.max;
       END IF;
       self.max := ctx2.max;
     ELSIF ctx2.max > self.secmax THEN
       self.secmax := ctx2.max;
     END IF;
     RETURN ODCIConst.Success;
   END;
   END;
   /

   ```
 2. 定义用户自定义聚合函数

   此函数定义通过指定其签名和实现 `ODCIAggregate` 接口的对象类型来创建 `SecMax()` 聚合函数：

   ```sql
   CREATE FUNCTION SecMax (input NUMBER) RETURN NUMBER
   PARALLEL_ENABLE AGGREGATE USING SecMaxImpl;/

   ```

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
