ORACLE 多行转一行函数WMSYS.WM_CONCAT和LISTAGG的使用

作者: admin 分类: Oracle数据库 发布时间: 2019-02-18 12:19  阅读: 330 views

WMSYS.WM_CONCAT缺点:

1、WMSYS.WM_CONCAT是非公开函数,它的用户是WMSYS,而不是SYS或者SYSTEM.
2、大量使用WM_CONCAT函数也会导致临时表空间爆满,这是因为返回类型为CLOB,CLOB占用的临时表空间只有在连接释放后才会释放.
3、ORACLE12G后不支持该函数的使用

WMSYS.WM_CONCAT 使用:

SELECT TABLE_NAME,COLUMN_NAME,COLUMN_ID
FROM   USER_TAB_COLUMNS
WHERE  TABLE_NAME = 'TEST_LA';--表名可根据实际情况替换

wm_concat和listagg的使用

SELECT TABLE_NAME,WM_CONCAT(COLUMN_NAME)
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'TEST_LA'
GROUP BY TABLE_NAME;

wm_concat和listagg的使用

SELECT TABLE_NAME,TO_CHAR(WM_CONCAT(COLUMN_NAME))
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'TEST_LA'
GROUP BY TABLE_NAME;

wm_concat和listagg的使用

WMSYS.WM_CONCAT 在 10.2.0.4版本以前是 VARCHAR2 类型,但是 从 10.2.0.5 开始,是 CLOB 类型
ORACLE12G后可使用LISTAGG函数代替。

Oracle 11g Release 2介绍了LISTAGG 函数,使得聚集连接字符串变得很容易。并且允许使用我们指定连接串中的字段顺序

LISTAGG函数用法:
wm_concat和listagg的使用

LISTAGG根据order by子句对列值进行排序,将排序后的结果拼接起来。
measure_expr:可以是任何基于列的表达式。
delimiter:分隔符,默认为NUL
order_by_clause:order by子句决定了列值被拼接的顺序。
通过该用法,可以看出LISTAGG函数不仅可作为一个普通函数使用,也可作为分析函数。
LISTAGG函数使用:

SELECT TABLE_NAME,LISTAGG(COLUMN_NAME, ',') WITHIN GROUP(ORDER BY COLUMN_ID) AS ALL_COLUMN
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'TEST_LA'
GROUP BY TABLE_NAME;

wm_concat和listagg的使用

效果同WM_CONCAT函数。


   原创文章,转载请标明本文链接: ORACLE 多行转一行函数WMSYS.WM_CONCAT和LISTAGG的使用

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注