首批通过分布式安全可靠测评,为关键业务系统打造
创建用户自定义聚合函数
更新时间: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;/