使用to_clob后,字符串连接的结果太长

时间:2012-11-15 10:34:27

标签: sql oracle11g

我正在尝试通过运行下面的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。感谢您的帮助。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

无需创建自定义功能。 Oracle已经提供了xmlagg函数。

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

SELECT RTRIM(XMLAGG(XMLELEMENT(E,colname,',').EXTRACT('//text()') ORDER BY colname).GetClobVal(),',') from tablename;