【问题标题】:ORA-01489: Oracle - ORA-01489: result of string concatenation is too longORA-01489: Oracle - ORA-01489: 字符串连接的结果太长
【发布时间】:2017-02-06 16:26:49
【问题描述】:

我处理这个查询并得到这个错误:

Oracle - ORA-01489:字符串连接的结果太长

请有人帮忙解决这个问题

SELECT LISTAGG(RCRDNUM) WITHIN GROUP (ORDER BY RCRDNUM)
FROM (SELECT (ERR.RCRDNUM || ',') AS RCRDNUM
      FROM TABLENAME ERR
      INNER JOIN (SELECT UPPER(REGEXP_SUBSTR('No value present for CNTRY_CD column for the record',
                                             '[^,]+', 1, LEVEL)) ERR_MSG
                  FROM DUAL
                  CONNECT BY REGEXP_SUBSTR('No value present for CNTRY_CD column for the record',
                                           '[^,]+', 1, LEVEL)
                      IS NOT NULL) ERRMSG_P
      ON (UPPER(ERR.ERRMSG) = ERRMSG_P.ERR_MSG
          OR 'No value present for CNTRY_CD column for the record' IS NULL))

【问题讨论】:

  • listagg 的结果是否可能超过 4000 个字符?如果是这样,你不能使用listagg(或者你需要在你的内联视图中提供一个过滤器来减少返回的行数)。如果您需要生成更长的字符串,您可以编写自己的聚合函数来处理clob 数据类型(网上有一些实现)。
  • @JustinCave - ...或使用xmlagg()

标签: oracle oracle11g


【解决方案1】:

如果聚合列表是一个长度超过 4000 个字符的字符串,则该字符串需要是 CLOB,并且不能使用listagg()。但是,您可以使用xmlagg(),它没有 4000 个字符的限制。结果必须是 CLOB - 并且它在解决方案中被转换为 CLOB。

。这是一个概念验证;我会让你适应你的情况。

with a (id,val) as (select 10, 'x' from dual union all select 20, 'abc' from dual)
select listagg(val, ',') within group (order by id) as l_agg,
       rtrim( xmlcast( xmlagg( xmlelement(e, val || ',') order by id) as clob), ',')
       as clob_agg
from   a
; 

输出

L_AGG      CLOB_AGG
---------- ----------
x,abc      x,abc

【讨论】:

    【解决方案2】:

    在 Oracle 的 SQL 查询中,字符串(VARCHAR 类型的列)限制为 4000 个字符。显然,您的查询会创建更长的字符串,因此会失败。 LISTAGG 很容易发生这种情况。

    您的查询真的应该返回这么长的字符串吗?如果没有,您需要处理您的查询。

    如果您确实需要超过 4000 个字符的值,您可以通过使用自定义的用户定义聚合函数尝试使用 CLOB 而不是 VARCHAR。 Tom Kyte 在他的一个问题中有一个example

    【讨论】:

      猜你喜欢
      • 2011-08-13
      • 2015-06-28
      • 2016-05-28
      • 1970-01-01
      • 2013-04-04
      • 2012-05-12
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      相关资源
      最近更新 更多