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.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 emp.deptno,func_strcat(emp.ename) from emp group by emp.deptno;

10 CLARK|MILLER|KING
20 SMITH|FORD|ADAMS|SCOTT|JONES
30 ALLEN|JAMES|TURNER|BLAKE|MARTIN|WARD

最近发现竟然有一个系统的函数可以直接连接字符串

select emp.deptno,replace(wmsys.wm_concat(emp.ename),',','|') from emp group by emp.deptno;

结果和4一样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值