Oracle字符串的连接聚合函数可用于group by

Oraclezcy 2012-02-17

1.新建type strcat_type

-- 定义类型 聚合函数的实质就是一个对象  
create or replace type strcat_type as object (  
    cat_string varchar2(4000),  
    --对象初始化  
    static function ODCIAggregateInitialize(cs_ctx In Out strcat_type)  
        return number,  
        --聚合函数的迭代方法(这是最重要的方法)  
    member function ODCIAggregateIterate(self In Out strcat_type,value in varchar2)  
        return number,  
        --当查询语句并行运行时,才会使用该方法,可将多个并行运行的查询结果聚合  
    member function ODCIAggregateMerge(self In Out strcat_type,ctx2 In Out strcat_type)  
        return number,  
        --终止聚集函数的处理,返回聚集函数处理的结果  
    member function ODCIAggregateTerminate(self In Out strcat_type,returnValue Out varchar2,flags in number)  
        return number  
)

2.建立type body strcat_type
create or replace type body strcat_type is 
  static function ODCIAggregateInitialize(cs_ctx IN OUT strcat_type) return number  
  is 
  begin 
      cs_ctx := strcat_type( null );  
      return ODCIConst.Success;  
  end;  
  member function ODCIAggregateIterate(self IN OUT strcat_type,  
                                      value IN varchar2 )  
  return number  
  is 
  begin 
        /*字符串已','分割 */  
      self.cat_string := self.cat_string || ','|| value;  
      return ODCIConst.Success;  
  end;  
  member function ODCIAggregateTerminate(self IN Out strcat_type,  
                                        returnValue OUT varchar2,  
                                        flags IN number)  
  return number  
  is 
  begin
        /*去除空(is null)*/  
      returnValue := ltrim(rtrim(self.cat_string,','),',');  
      return ODCIConst.Success;  
  end;  
  member function ODCIAggregateMerge(self IN OUT strcat_type,  
                                    ctx2 IN Out strcat_type)  
  return number  
  is 
  begin 
      self.cat_string := self.cat_string || ',' || ctx2.cat_string;  
      return ODCIConst.Success;  
  end;
end;

3.建立函数func_strcat

CREATE OR REPLACE FUNCTION func_strcat(input varchar2)  
RETURN varchar2 -- 返回值  
PARALLEL_ENABLE AGGREGATE USING strcat_type; --使平行累加

------以上函数的建立摘自网络--------
4.结果
select * from t_test t;

id      keyword synonyms
1 咖啡 咖啡厅
2 咖啡 咖啡屋
3 咖啡 咖啡店
4 音乐 流行音乐
5 音乐 古典音乐
6 生活 恬静的生活
7 生活 安逸的生活
_________________________________________
select  t.keyword,func_strcat(t.synonyms)
from t_test t group by t.keyword;

keyword func_strcat(t.synonyms)
咖啡 咖啡厅,咖啡屋,咖啡店
生活 恬静的生活,安逸的生活
音乐 流行音乐,古典音乐

相关推荐