关于oracle开发中碰到的同列多行合并字符串的问题

如何将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&timestamp=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 拼接条件

本次随笔到此结束!谢谢各位观看。

posted @   我是一个邓疯子  阅读(1011)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
ヾ(≧O≦)〃嗷~,

这是回到顶部的路哦

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示