一尘不染

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

sql

我正在尝试通过运行以下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。我在这里先向您的帮助表示感谢。


阅读 304

收藏
2021-03-08

共1个答案

一尘不染

LISTAGG中最长的串联字符串可以是4000个字符。在此查询中,一个或多个CMNT_REAS_TYP值的CMNT_TXT长度总和似乎大于4000。LISTAGG会在LPAD将其截断为4000个字符之前生成字符串-
因此LPAD在这种情况下无效。另外,TO_CLOB也没有影响,因为LISTAGG在发生任何其他事情之前先进入了varchar2。

解决此问题的一种方法是在可能的情况下在“分组依据”中添加其他字段。如果这不是一个选择,则可以尝试使用COLLECT而不是LISTAGG-
在使数据类型匹配方面会遇到更多问题,但这是可行的。

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

2021-03-08