2017-07-03 62 views
1

我有一个简单的Select查询来聚合包含大文本的一列。 以下为我工作的小文本,但我现在超过了Listagg字符限制(4000字节?)。Oracle SQL:聚合大文本的替代方法(当超出Listagg限制时)

我对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

如果32K足够只需要设置'MAX_STRING_SIZE'到'extended':https://docs.oracle.com/database/121/REFRN/GUID-D424D23B-0933-425F -BC69-9C0E6724693C.htm#REFRN10321 –

+0

@a_horse_with_no_name:谢谢你。 32k就足够了,因为我只希望最多可以容纳10k个字符,但在这种情况下,我不能对数据库或常规SQL设置进行任何更改。 – keewee279

回答

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 ... 

第2种方法。 Oracle允许以创造自己的聚合功能user defined aggregation function

+0

非常感谢!你能否解释一下,因为我对Oracle非常陌生,所以我可以正确应用它?这是否没有字符限制(可能多达10000个字符)? – keewee279

+1

在这里你有限制高达4GB。如果从代码中删除.extract('// text()'),您将看到普通的xml。 –

+0

非常感谢。我会接受这一点,真的很喜欢这种方法。您可能只需添加一两句话来解释“xxx”和“.getClobval”的用途? – keewee279