?
WM_CONCAT(colName)為Oracle 10g中行數(shù)據(jù)轉(zhuǎn)列數(shù)據(jù)的內(nèi)置函數(shù),執(zhí)行效果如下
表T
A B
------------
1 2
1 3
1 4
2 1
2 3
執(zhí)行語句 :
SELECT
A, WM_CONCAT(B) B
FROM
T
GROUP
BY
A
執(zhí)行結(jié)果:
A B
---------------
1 2,3,4
2 1,3
?
注意:
當(dāng)在包體內(nèi)使用行轉(zhuǎn)列時(shí),WM_CONCAT(colName)可以使用,但WM_CONCAT(DISTINCT?colName)會(huì)在包編譯時(shí)會(huì)報(bào)錯(cuò),
例如,在某一包的某一存儲過程中有如下語句:
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
;
?
? ? ? 編譯時(shí)會(huì)報(bào)如下錯(cuò)誤:
? ? ?PL/SQL:ORA-30482:DISTINCT option not allowed for this function.
?
解決方案:
使用動(dòng)態(tài)SQL(字符串中有單引號由兩個(gè)單引號表示):
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實(shí)現(xiàn)行轉(zhuǎn)列,寫法如下:
SELECT
A, LISTAGG(B,
'
,
'
) WITHIN
GROUP
(
ORDER
BY
B) B
FROM
T
GROUP BY
A
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

