【问题标题】:Oracle SQL: Alternative to aggregate large texts (when exceeding Listagg limit)Oracle SQL:聚合大文本的替代方法(超过 Listagg 限制时)
【发布时间】:2017-12-07 01:10:23
【问题描述】:

我有一个简单的 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
/* ... */

非常感谢您对此的任何帮助,
迈克

【问题讨论】:

  • 如果 32k 就足够了,那么只需将 MAX_STRING_SIZE 设置为 extended: docs.oracle.com/database/121/REFRN/…
  • @a_horse_with_no_name:谢谢。 32k 就足够了,因为我只期望 max items 最多 10k 个字符,但在这种情况下我不能对 db 或一般 SQL 设置进行任何更改。

标签: sql oracle aggregate string-concatenation listagg


【解决方案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

【讨论】:

  • 非常感谢!您能否解释一下,因为我对 Oracle 很陌生,以便我可以正确应用它?这是否没有字符限制(最多 10000 个字符)?
  • 这里您的容量上限为 4gb。如果你从代码中删除 .extract('//text()') 你会看到正常的 xml。
  • 非常感谢。我会接受这一点,并且非常喜欢这种方法。您能否只添加一两句话来解释“xxx”和“.getClobval”的用途?
  • 另外,我应该读 ORDER BY 而不是 ORDER 对吗? :)
  • 是的应该是ordere byxmlagg是聚合xmltype的函数,它只接受xmltypexmlelement(xxx,'somthing') 创建 &lt;xxx&gt;somthing&lt;/xxx&gt;xmlelement(xxx,'something').extract('//text()') 仅返回“某物”,但该元素的数据类型不是字符串,而是 xmltype。并且表达式可以在xmlagg中使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多