如何将Oracle中同一列的多行记录拼接成一个字符串?
本人在oracle的存储过程的开发中,碰到了同一列的多行记录需要拼接成一个字符串进行存储,特此再次记录!
1.可以使用wm_concat()函数。下面给出例子(本数据库不支持wm_cocat()函数进行使用,所以找了一个例子语句供他人参考!)。
select deptno,wm_concat(ename) from emp group by deptno;
本人使用此函数报错ORA-00904: "wm_concat":invalid identifier。原因如下:
若在创建数据库的时候没有创建WMSYS用户,则在SQL或PL/SQL中有用到WM_CONCAT函数的时候就会报ORA-00904的错误。其实,WMSYS用户下的WM_CONCAT函数有很重要的用途,比如行转列,但是该函数不稳定。例如,在Oracle 10g上返回的是字符串类型,但是在Oracle 11gR2上返回的是CLOB类型。很多数据库开发人员在程序中都使用了该函数,若是系统升级,则会导致程序出现错误。为了减轻程序员修改程序的工作量,只有重建函数WM_CONCAT来解决该问题。
若没有创建WMSYS用户的话,则在查询DBA_OBJECTS视图的时候就不能查询到WM_CONCAT的相关信息。在正常情况下查询DBA_OBJECTS视图,会有如下的信息:
SQL> SELECT * FROM DBA_OBJECTS WHERE OBJECT_NAME LIKE 'WM_CONCAT%';
具体措施措施可以看下面这位大佬的贴子->
https://mp.weixin.qq.com/s?src=11×tamp=1671186011&ver=4230&signature=ELntaMPJXpT-5VZrVeCX26-tHPUn2kjBpcMPFV4370*hj3gmjS*ChlIKX35QIp7dVCl95jNG*mgxsIoJgVYVNqZSlN4dtdFGpBZdIX-Af3D1K6T4zRHzDF10c2QjGfPc&new=1
2.因为上面那种方法我使用的数据库会报错,与WM_CONCAT相似的还有一个函数是LISTAGG。这是一个Oracle的列转行函数,使用示例如下所示,所以采用第二种方法,也就是LISTAGG函数:
sql语句:select listagg(字段名,',') within group (order by 字段名) as 别名 from table where 拼接条件