ユーザー定義集計関数を作成するプロセスには、ODCIAggregate インターフェースの実装とユーザー定義集計関数の定義という2つのステップが含まれます。
適用対象
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
本記事では、SecMax() を例に、ユーザー定義集計関数の作成方法について詳しく説明します。SecMax() は、一連の数値の中で2番目に大きい値を返すために使用されます。
ODCIAggregateインターフェースを実装するODCIAggregateルーチンは、オブジェクト型SecMaxImpl内のメソッドとして実装されます。/*SecMaxImplタイプを実装してODCIAggregateルーチンを含める*/ CREATE OR REPLACE TYPE SecMaxImpl AS OBJECT ( max NUMBER, -- 現在の最大値 secmax NUMBER, -- 現在の2番目に大きい値 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;/