本例實現的是連接字符串,並且去掉重複的項。
聚合函數實際上就是一個對象:
- 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
- )
- 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;
最後定義函數,使用的是上面定義的對象:
- create or replace function distinct_concat(input varchar2) return varchar2
- parallel_enable
- aggregate using distinct_concat_type;