傅老師課堂:Oracle高級應用之去重聚合函數

本例實現的是連接字符串,並且去掉重複的項。

聚合函數實際上就是一個對象:

  1. create or replace type distinct_concat_type as object  
  2. (  
  3. --對象變量  
  4.   cat_string varchar2(500),  
  5. --對象初始化  
  6.   static function ODCIAggregateInitialize(cs_ctx In Out distinct_concat_type)  
  7.     return number,  
  8. --聚合函數的迭代方法  
  9.   member function ODCIAggregateIterate(self  In Out distinct_concat_type,  
  10.                                        value in varchar2) return number,  
  11. --當查詢語句並行運行時,纔會使用該方法,可將多個並行運行的查詢結果聚合  
  12.   member function ODCIAggregateMerge(self In Out distinct_concat_type,  
  13.                                      ctx2 In Out distinct_concat_type)  
  14.     return number,  
  15. --終止聚集函數的處理,返回聚集函數處理的結果  
  16.   member function ODCIAggregateTerminate(self        In Out distinct_concat_type,  
  17.                                          returnValue Out varchar2,  
  18.                                          flags       in number)  
  19.     return number  
  20. )  
接着實現對象主體:
  1. create or replace type body distinct_concat_type is  
  2.   --對象初始化  
  3.   static function ODCIAggregateInitialize(cs_ctx IN OUT distinct_concat_type)  
  4.     return number is  
  5.   begin  
  6.     cs_ctx := distinct_concat_type(null);  
  7.     return ODCIConst.Success;  
  8.   end;  
  9.   
  10.   --聚合函數的迭代方法  
  11.   member function ODCIAggregateIterate(self  IN OUT distinct_concat_type,  
  12.                                        value IN varchar2) return number is  
  13.   begin  
  14.     if self.cat_string is null or (instr(self.cat_string, value, 1, 1) = 0) then  
  15.       self.cat_string := self.cat_string || ',' || value;  
  16.     end if;  
  17.     return ODCIConst.Success;  
  18.   end;  
  19.   
  20.   --當查詢語句並行運行時,纔會使用該方法,可將多個並行運行的查詢結果聚合  
  21.   member function ODCIAggregateMerge(self IN OUT distinct_concat_type,  
  22.                                      ctx2 IN Out distinct_concat_type)  
  23.     return number is  
  24.   begin  
  25.     if self.cat_string is null or  
  26.        (instr(self.cat_string, ctx2.cat_string, 1, 1) = 0) then  
  27.       self.cat_string := self.cat_string || ',' || ctx2.cat_string;  
  28.     end if;  
  29.     return ODCIConst.Success;  
  30.   end;  
  31.   
  32.   --終止聚集函數的處理,返回聚集函數處理的結果  
  33.   member function ODCIAggregateTerminate(self        IN Out distinct_concat_type,  
  34.                                          returnValue OUT varchar2,  
  35.                                          flags       IN number) return number is  
  36.   begin  
  37.     returnValue := ltrim(rtrim(self.cat_string, ','), ',');  
  38.     return ODCIConst.Success;  
  39.   end;  
  40. end;  

最後定義函數,使用的是上面定義的對象:
  1. create or replace function distinct_concat(input varchar2) return varchar2  
  2.   parallel_enable  
  3.   aggregate using distinct_concat_type; 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章