首页 > 代码库 > oracle中多行合并聚合函数

oracle中多行合并聚合函数

在oracle数据库中, 进行字段合并,可以使用wm_concat(column)函数,但是在这种方法不被Oracle所推荐,因为WMSYS用户用于Workspace Manager,其函数对象可能因版本而不同而出现异常,这种变化在11.2.0.3及10.2.0.5中体现出来。原本WM_CONCAT函数返回值为 VARCHAR2,但在一些版本下就会变更为CLOB。这一变化导致了很多程序的异常。
Oracle建议用户使用自定义函数来实现该功能,而不是使用WorkSpace的这个内部函数。这个函数包含一个Type、Type Body、Function,可以参考Oracle的实现方式来实现这个函数。

 

 

COUNTRY              CITY
-------------------- --------------------
中国                 台北
中国                 香港
中国                 上海
日本                 东京
日本                 大阪

COUNTRY              CITY
-------------------- --------------------
中国                 台北 香港 上海
日本                 东京 大阪

select country,strcat(city) from t_city group by country

1.创建类型

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. 创建类型体

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
      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.创建函数
CREATE OR REPLACE FUNCTION strcat(input varchar2 )
RETURN varchar2
PARALLEL_ENABLE AGGREGATE USING strcat_type;

oracle中多行合并聚合函数