在开发过程中会遇到合并记录的情况,一般使用wmsys.wm_concat()即可,例如:
select zf_bh,wmsys.wm_concat(shgx) NO_SHGX from (select shgx from T_YZGL_DK_SHGX where zf_bh is not null) group by zf_bh
但是wmsys.wm_concat()使用是有前提的,那就是合并后的字符串长度不能大于4000,大于4000后就出现长度超过系统限制的异常;
这时可以使用XMLAGG(XMLELEMENT(E, field || '\n')).EXTRACT('//text()').getclobval();这里‘\n’为换行符作为连接符号,也可以用其它的例如‘,’;这样就能解决问题。
select zf_bh,XMLAGG(XMLELEMENT(E, shgx || '\n')).EXTRACT('//text()').getclobval() NO_SHGX from (select shgx from T_YZGL_DK_SHGX where zf_bh is not null) group by zf_bh
但是今天在实际开发过程中居然出现了ORA-31061:XDB错误:special char to escaped char conversion failed,有点莫名其妙啊,说特殊字符转义失败;最后再oracle官网找到了解决办法,将sql修改为:
select zf_bh,XMLAGG(XMLELEMENT(E,REGEXP_REPLACE(shgx,'[[:cntrl:]]'),'\n') ORDER BY CAST(shgx AS varchar2(4000))).EXTRACT('//text()').getclobval() NO_SHGX from (select shgx from T_YZGL_DK_SHGX where zf_bh is not null) group by zf_bh
参考https://community.oracle.com/message/14248976