wmsys.wm_concat函数简洁

 

wmsys.wm_concat是一个类似sum、max等的聚合函数,用于字符串的连接,因此一般要搭配group by 或 over(partition xx)使用。默认用‘,’连接多个字符串

例如现在有个学生表,表里有学生名字,学生报名学科两个字段

create table student(
name varchar2(20),
subject varchar2(30)
);

insert into student values('justin','english');
insert into student values('justin','math');
insert into student values('justin','mandarin');

 现在有个业务场景,我查询每个学生报名学科,但是每个学生只要一条数据展示,也就是将学科整合起来,以便于查看。

可以用如下查询语句进行查询

select name,wmsys.wm_concat(subject) as subject
from student
group by name

 结果如下

 

 

 

 

使用该函数有以下问题:

1.该函数不是oracle公开的系统函数,它的用户是wmsys,而不是sys或者system,oracle很有可能在版本升级或者补丁的时候取消或者修改这个函数甚至用户,这种变化oracle是不会公开的。所有可能会由于这个变化而导致异常。

2.大量使用这个函数也会导致临时表空间爆满,这是因为在10.2.0.5中,使用wmsys.wm_concat返回的结果格式是CLOB,CLOB占用的临时表空间只有在连接释放后才会释放,部分通过连接池连接数据库的长连接很有可能导致CLOB占用临时表空间不断累积增大,会导致临时表空间爆满的故障

3.如果是在程序中大量使用这个函数的话会引起enq:TT的锁,可能会导致某些对象被锁。

 

 另外在项目中发现在mybatis中如果将wmsys.wm_concat结果保存在一个类对象中没问题,但是如果存在一个hashmap中结果就是weblogic的clob对象的toString()结果,也就是getClass().getName() + '@' + Integer.toHexString(hashCode()),解决方法就是在wmsys.wm_concat函数外套一个to_char函数就没问题了

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值