对字符串的“sum”——Oracle里实现类似MySQL group_concat函数

时间:2021-08-10 07:13:37

oracle自定义聚集函数接口简介
   a. static function ODCIAggregateInitialize(sctx IN OUTstring_agg_type )   
               return number
   自定义聚集函数初始化设置,从这儿开始一个聚集函数
   b. member function ODCIAggregateIterate(self IN OUT string_agg_type ,value IN varchar2)
               return number
    自定义聚集函数,最主要的步骤,这个函数定义我们的聚集函数具体做什么操作,后面的例子,是取最大值,最小值,平均值,还是做连接操作.self 为当前聚集函数的指针,用来与前面的计算结果进行关联
   c. member function ODCIAggregateMerge (self IN string_agg_type,returnValue OUT  varchar2,flags IN number)
             return number
     用来合并两个聚集函数的两个不同的指针对应的结果,用户合并不同结果结的数据,特别是处理并行(parallel)查询聚集函数的时候.
    d. member function OCDIAggregateTerminate(self IN string_agg_type,returnValue OUT varchar2,flags IN number)
     终止聚集函数的处理,返回聚集函数处理的结果.


1 首先定义strcat函数,实现字符串叠加功能:

--********************************************************
create 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
)
/

--********************************************************

create 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;
/

--********************************************************

CREATE or replace FUNCTION strcat(input varchar2 ) RETURN varchar2 PARALLEL_ENABLE AGGREGATE USING strcat_type;
/


2,然后使用该函数进行查询

select objectid,strcat(name) name from future_attachment
where objectType = 'Bug' group by objectid



clob类型字段在查询结果不能直接显示

使用DBMS_LOB.substr函数,如下

select DBMS_LOB.substr(a.description) ,a.* from is_issue a