2013-03-28 99 views
4

Oracle數據庫11g企業版版本11.2.0.2.0 - 64位生產。如何在選擇查詢中調整LISTAGG以支持超過4000個字符?

我有一個表格,格式如下。

Name  Department 
Johny Dep1 
Jacky Dep2 
Ramu  Dep1 

我需要以下格式的輸出。

Dep1 - Johny,Ramu 
Dep2 - Jacky 

我試過'LISTAGG'功能,但有4000個字符的硬限制。由於我的數據庫表是巨大的,這不能在應用程序中使用。另一種選擇是使用

SELECT CAST(COLLECT(Name) 

但我的框架,讓我只執行選擇查詢,沒有PL/SQL scripts.Hence我沒有發現任何方式使用「CREATE TYPE」創建一個類型,是必需的命令爲COLLECT命令。

是否有任何替代方法使用select查詢來實現上述結果?

回答

5

如果你不能創建類型(你不能僅僅使用sql * plus來創建一個?),但是你可以使用COLLECT,然後使用內置數組。在RDBMS中有幾個問題。運行此查詢:

select owner, type_name, coll_type, elem_type_name, upper_bound, length 
from all_coll_types 
where elem_type_name = 'VARCHAR2'; 

例如在我的分貝,我可以使用sys.DBMSOUTPUT_LINESARRAY這是一個相當大的varray。

select department, 
     cast(collect(name) as sys.DBMSOUTPUT_LINESARRAY) 
    from emp 
group by department; 
+0

感謝Dazzal。 DBMSOUTPUT_LINESARRAY也在我的db中工作。我通過使用XMLAGG找到了另一種方法。 Plz讓我知道哪一個是最好用的考慮我的emp表包含20000多行。 – 2013-03-28 19:16:35

+0

@AnuChandran測試兩者,看看哪個更適合你。 XML方法就像[here](http://stackoverflow.com/questions/14864055/listagg-function-and-ora-01489-result-of-string-concatenation-is-too-long)雖然會有一些開銷。 – DazzaL 2013-03-29 12:04:56

3

我使用不具有4000

select department, 
XMLAGG(XMLELEMENT(E,name||',')).EXTRACT('//text()') 
from emp 
group by department; 
+0

有用,但請注意結果可能包含實體轉義。 – 2014-04-15 18:54:59

+0

我懷疑任何公然在其命名模式中揮舞單詞LAG的功能。 – 2016-05-23 07:01:18

3

硬限制@anuu_online的衍生物,但處理在反向轉義的結果的XML XMLAGG函數在另一種方法中結束。

dbms_xmlgen.convert(xmlagg(xmlelement(E, name||',')).extract('//text()').getclobval(),1) 
7

您應該添加GetClobVal同時還需要RTRIM,因爲它會在結果的最後返回分隔符。

SELECT RTRIM(XMLAGG(XMLELEMENT(E,colname,',').EXTRACT('//text()') 
    ORDER BY colname).GetClobVal(),',') from tablename; 
相關問題