本例實現的是連接字串,並且去掉重複的項。
彙總函式實際上就是一個對象: [sql] view plain copy create or replace type distinct_concat_type as object ( --物件變數 cat_string varchar2(500), --對象初始化 static function ODCIAggregateInitialize(cs_ctx In Out distinct_concat_type) return number, --彙總函式的迭代方法 member function ODCIAggregateIterate(self In Out distinct_concat_type, value in varchar2) return number, --當查詢語句並行運行時,才會使用該方法,可將多個並行啟動並執行查詢結果彙總 member function ODCIAggregateMerge(self In Out distinct_concat_type, ctx2 In Out distinct_concat_type) return number, --終止聚集合函式的處理,返回聚集合函式處理的結果 member function ODCIAggregateTerminate(self In Out distinct_concat_type, returnValue Out varchar2, flags in number) return number ) 接著實現對象主體: [sql] view plain copy create or replace type body distinct_concat_type is --對象初始化 static function ODCIAggregateInitialize(cs_ctx IN OUT distinct_concat_type) return number is begin cs_ctx := distinct_concat_type(null); return ODCIConst.Success; end; --彙總函式的迭代方法 member function ODCIAggregateIterate(self IN OUT distinct_concat_type, value IN varchar2) return number is begin if self.cat_string is null or (instr(self.cat_string, value, 1, 1) = 0) then self.cat_string := self.cat_string || ',' || value; end if; return ODCIConst.Success; end; --當查詢語句並行運行時,才會使用該方法,可將多個並行啟動並執行查詢結果彙總 member function ODCIAggregateMerge(self IN OUT distinct_concat_type, ctx2 IN Out distinct_concat_type) return number is begin if self.cat_string is null or (instr(self.cat_string, ctx2.cat_string, 1, 1) = 0) then self.cat_string := self.cat_string || ',' || ctx2.cat_string; end if; return ODCIConst.Success; end; --終止聚集合函式的處理,返回聚集合函式處理的結果 member function ODCIAggregateTerminate(self IN Out distinct_concat_type, returnValue OUT varchar2, flags IN number) return number is begin returnValue := ltrim(rtrim(self.cat_string, ','), ','); return ODCIConst.Success; end; end;
最後定義函數,使用的是上面定義的對象: [sql] view plain copy create or replace function distinct_concat(input varchar2) return varchar2 parallel_enable aggregate using distinct_concat_type;