ユーザー定義集約関数を作成するプロセスは、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;/