2013-04-16 23 views
5

關於此主題有許多類似的問題,但我找不到任何解決方案考慮了任何最終結果對於varchar2過大的解決方案。將行連接到CLOB中

所以我想要做的是改變這一點:

Column1 | Column2 
-------- -------- 
1   Hello 
1   world, 
1   please help 
2   Thanks 
2   world, 
2   you're the best. 

進入這個:

Column1 | Column2 
-------- -------- 
1   Hello world, please help 
2   Thanks world, you're the best. 

我的具體問題是,有在新的級聯值超過4000少數病例字符,所以我不能像我所希望的那樣使用LISTAGG。我對解決方案特別感興趣,而不必編寫函數,但兩者都可以。

+2

你看到這個http://stackoverflow.com/questions/9412512/替代-list-list-in-oracle? –

+0

LISTAGG的結果受限於SQL中VARCHAR2的最大大小(即4000)。對於較大的字符串,我們需要使用其他方法來收集元素(例如集合或用戶定義的PL/SQL函數)。 –

回答

2

正如de.hh.holger已經指出的那樣,LISTAGG WITH CLOB? STRING AGGREGATION EXCEEDING 4000 CHARACTERS WITH XMLAGG確實解決了這個問題。

我已經制定了一個遠一點關於這個問題,這應該做的伎倆在一個很長的字符串消息的情況下:

SELECT 
    table_row_id, 
    DBMS_XMLGEN.CONVERT (
    EXTRACT(
     xmltype('<?xml version="1.0"?><document>' || 
       XMLAGG(
       XMLTYPE('<V>' || DBMS_XMLGEN.CONVERT(data_value)|| '</V>') 
       order by myOrder).getclobval() || '</document>'), 
       '/document/V/text()').getclobval(),1) AS data_value 
FROM (
    SELECT 1 myOrder, 1 table_row_id,'abcdefg>' data_value FROM dual 
    UNION ALL 
    SELECT 2, 1 table_row_id,'hijklmn' data_value FROM dual 
    UNION ALL 
    SELECT 3, 1 table_row_id,'opqrst' data_value FROM dual 
    UNION ALL 
    SELECT 4, 1 table_row_id,'uvwxyz' data_value FROM dual) 
GROUP BY 
    table_row_id