基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
创建用户自定义聚合函数
更新时间:2025-09-08 16:00:42
创建用户定义聚合函数的过程包括实现 ODCIAggregate 接口和定义用户自定义聚合函数两个步骤。
功能适用性
该内容仅适用于 OceanBase 数据库企业版。OceanBase 数据库社区版仅提供 MySQL 模式。
本文以 SecMax() 为例,详细介绍如何创建用户自定义聚合函数。SecMax() 用于返回一组数字中的第二大值。
实现
ODCIAggregate接口ODCIAggregate例程是作为对象类型SecMaxImpl中的方法来实现的。/*实现类型 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; /定义用户自定义聚合函数
此函数定义通过指定其签名和实现
ODCIAggregate接口的对象类型来创建SecMax()聚合函数:CREATE FUNCTION SecMax (input NUMBER) RETURN NUMBER PARALLEL_ENABLE AGGREGATE USING SecMaxImpl;/