1.新建type strcat_type 
 
 
  
  1. -- 定义类型 聚合函数的本质就是一个对象    
  2. create or replace type strcat_type as object (    
  3.     cat_string varchar2(4000),    
  4.     --对象初始化    
  5.     static function ODCIAggregateInitialize(cs_ctx In Out strcat_type)    
  6.         return number,    
  7.         --聚合函数的迭×××法(这是最首要的办法)    
  8.     member function ODCIAggregateIterate(self In Out strcat_type, value in varchar2)    
  9.         return number,    
  10.         --当查询语句并交运行时,才会应用该办法,可将多个并交运行的查询成果聚合    
  11.     member function ODCIAggregateMerge(self In Out strcat_type, ctx2 In Out strcat_type)    
  12.         return number,   
  13.         --终止凑集函数的处理惩罚,返回凑集函数处理惩罚的成果    
  14.     member function ODCIAggregateTerminate(self In Out strcat_type, returnValue Out varchar2, flags in number)
  15.         return number    
  16. )  
2.建树type body strcat_type 
 
  
  1. create or replace type body strcat_type is   
  2.   static function ODCIAggregateInitialize(cs_ctx IN OUT strcat_type) return number    
  3.   is   
  4.   begin   
  5.       cs_ctx := strcat_type(null );    
  6.       return ODCIConst.Success;    
  7.   end;    
  8.   member function ODCIAggregateIterate(self  IN OUT strcat_type,  
  9.                                        value IN varchar2 )    
  10.   return number    
  11.   is   
  12.   begin   
  13.         /*字符串已""""分别 */    
  14.       self.cat_string := self.cat_string || "",""|| value;    
  15.       return ODCIConst.Success;    
  16.   end;    
  17.   member function ODCIAggregateTerminate(self IN Out strcat_type,    
  18.                                          returnValue OUT varchar2,    
  19.                                          flags IN number)   
  20.   return number    
  21.   is   
  22.   begin  
  23.         /*去除空(is null)*/    
  24.       returnValue := ltrim(rtrim(self.cat_string,"",""),"","");    
  25.       return ODCIConst.Success;    
  26.   end;    
  27.   member function ODCIAggregateMerge(self IN OUT strcat_type,    
  28.                                      ctx2 IN Out strcat_type)    
  29.   return number    
  30.   is   
  31.   begin   
  32.       self.cat_string := self.cat_string || "","" || ctx2.cat_string;    
  33.       return ODCIConst.Success;    
  34.   end;  
  35. end;  


3.建树函数func_strcat 
 
 
  
  1. CREATE OR REPLACE FUNCTION func_strcat(input varchar2)    
  2. RETURN varchar2 -- 返回值    
  3. PARALLEL_ENABLE AGGREGATE USING strcat_type; --使平行累加  


4.成果 
* t_test t; 

id      keyword synonyms 
1 咖啡 咖啡厅 
2 咖啡 咖啡屋 
3 咖啡 咖啡店 
4 音乐 风行音乐 
5 音乐 古典音乐 
6 生活生计 舒适的生活生计 
7 生活生计 安适的生活生计 
_________________________________________ 
  t.keyword,func_strcat(t.synonyms) 
t_test t group by t.keyword; 

keyword func_strcat(t.synonyms) 
咖啡 咖啡厅,咖啡屋,咖啡店 
生活生计 舒适的生活生计,安适的生活生计 
音乐 风行音乐,古典音乐