3

我正在尝试通过运行下面的 sql 创建一个表视图

  SELECT   IACM1.CMNT_REAS_TYP,
           TO_CLOB(LPAD (
                      LISTAGG (IACM1.CMNT_TXT, ' ')
                         WITHIN GROUP (ORDER BY IACM1.LN_NUM),
                      4000,
                      LISTAGG (IACM1.CMNT_TXT, ' ')
                         WITHIN GROUP (ORDER BY IACM1.LN_NUM)
                   ))
    FROM   FT_T_IACM IACM1, FT_T_IACM IACM2
   WHERE   IACM1.ISSACT_ID = IACM2.ISSACT_ID
           AND IACM1.CMNT_REAS_TYP = IACM2.CMNT_REAS_TYP
GROUP BY   IACM1.cmnt_reas_typ;

但我得到error以下

ORA-01489: 字符串连接的结果太长 01489. 00000 - “字符串连接的结果太长” *原因:字符串连接的结果超过了最大大小。*行动:确保结果小于最大大小。

我查了一下,发现了使用 to_clob 的建议,但它仍然抛出这个错误。我正在使用 oracle 11g。我在这里先向您的帮助表示感谢。

4

2 回答 2

3

LISTAGG 中的最长串联字符串可以是 4000 个字符。在此查询中,一个或多个 CMNT_REAS_TYP 值的 CMNT_TXT 长度总和似乎超过 4000。LISTAGG 在 LPAD 将其截断为 4000 个字符之前构建字符串 - 因此 LPAD 在这种情况下无效。此外,TO_CLOB 没有影响,因为 LISTAGG 在其他任何事情发生之前就转到了 varchar2。

解决此问题的一种方法是尽可能在您的 Group By 中添加其他字段。如果这不是一个选项,您可以尝试使用 COLLECT 而不是 LISTAGG - 在获取数据类型匹配时会遇到更多问题,但这是可行的。

这是一个链接,其中包含 LISTAGG 和 COLLECT 之间的一些比较以及如何使用 COLLECT:http ://www.oracle-developer.net/display.php?id=515

于 2012-11-15T17:27:20.570 回答
2

无需创建自定义函数。Oracle 已经提供了 xmlagg 函数来做到这一点。

您只需要通过 GetClobVal 将输出转换为 clob,还需要 rtrim,因为它将在结果末尾返回分隔符。

SELECT RTRIM(XMLAGG(XMLELEMENT(E,colname,',').EXTRACT('//text()') ORDER BY colname).GetClobVal(),',') from tablename;
于 2015-03-13T10:57:55.663 回答