ORACLE字符串的连接聚合函数可用于group by
    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.ca