Oracle SQL:聚合大型文本的替代方法(超过Listagg限制时)

时间:2017-07-03 17:24:37

标签: sql oracle aggregate string-concatenation listagg

我有一个简单的Select查询,它聚合一个包含大文本的列。 以下内容适用于小文本,但我现在超过了Listagg字符限制(4000字节?)。

我是Oracle的新手,无法找到适合我在线申请的解决方案。

有人可以告诉我最好的选择吗?

我的查询(简化):

SELECT
    m.S_ID AS SID
    , LISTAGG
    (
        'ITEM NO.: ' || m.ITEM || 
        ' -nl-ARTICLE: ' || a.ARTICLE || 
        ' -nl-NET: ' || m.NET || 
        ' -nl-TAX: ' || NVL(m.TAX, 0) || 
        ' -nl-GROSS: ' || (m.NET + m.TAX),
        ' -nl--nl-'
    ) WITHIN GROUP (ORDER BY m.S_ID) AS Details
    /* ... */
FROM 
    myTable m
/* ... */

非常感谢您提供的任何帮助,
麦克

1 个答案:

答案 0 :(得分:1)

可能的方法之一。

select xmlagg(xmlelement(xxx,'ITEM NO.: ' || m.ITEM || 
        ' -nl-ARTICLE: ' || a.ARTICLE || 
        ' -nl-NET: ' || m.NET || 
        ' -nl-TAX: ' || NVL(m.TAX, 0) || 
        ' -nl-GROSS: ' || (m.NET + m.TAX),
        ' -nl--nl-'||',<-separator').extract('//text()') order m.S_ID).getClobval() from mytable
group by ...

第二种方法。 oracle允许创建自己的聚合函数user defined aggregation function