Oracle 10g WM_CONCAT行转列函数用法及注意点

 

WM_CONCAT(colName)为Oracle 10g中行数据转列数据的内置函数,执行效果如下

表T

   A    B
------------
   1    2
   1    3
   1    4
   2    1
   2    3

执行语句 :

SELECT A, WM_CONCAT(B) B FROM T GROUP BY A

执行结果:

   A    B
---------------
   1    2,3,4
   2    1,3

 

注意:

  当在包体内使用行转列时,WM_CONCAT(colName)可以使用,但WM_CONCAT(DISTINCT colName)会在包编译时会报错,

  例如,在某一包的某一存储过程中有如下语句:

 1 UPDATE D_LOWAREA L
 2    SET L.BYQXH = (SELECT /*+index(b)*/
 3                    WM_CONCAT(DISTINCT XH.XHMC)
 4                     FROM OLIVE.OL$_ASSOCIATIONS A,
 5                          PMSBI.F_SB_SBXX_BASIC  B,
 6                          PMSBI.D_XH             XH
 7                    WHERE A.A IN (L.PDBYQ1, L.PDBYQ2, L.PDBYQ3)
 8                      AND A.B = B.SBBH
 9                      AND B.XHDM != 'wz'
10                      AND B.XHDM = XH.XHDM);
11 COMMIT;

 

     编译时会报如下错误:

     PL/SQL:ORA-30482:DISTINCT option not allowed for this function.

 

解决方案:

  使用动态SQL(字符串中有单引号由两个单引号表示):

 1    EXECUTE IMMEDIATE 
 2    'UPDATE D_LOWAREA L
 3       SET L.BYQXH = (SELECT /*+index(b)*/
 4                       WMSYS.WM_CONCAT(DISTINCT XH.XHMC)
 5                        FROM OLIVE.OL$_ASSOCIATIONS A,
 6                             PMSBI.F_SB_SBXX_BASIC  B,
 7                             PMSBI.D_XH             XH
 8                       WHERE A.A IN (L.PDBYQ1, L.PDBYQ2, L.PDBYQ3)
 9                         AND A.B = B.SBBH
10                         AND B.XHDM != ''wz''
11                         AND B.XHDM = XH.XHDM)';
12     COMMIT;

 

PS:Oracle 11g以上版本可以用LISTAGG实现行转列,写法如下:

SELECT A, LISTAGG(B, ',') WITHIN GROUP(ORDER BY B) B FROM T GROUP BY A

 

转载于:https://www.cnblogs.com/MickWoo/p/4026726.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值