result of string concatenation is too long after using to_clob
我正在尝试通过运行以下sql创建表视图
1 2 3 4 5 6 7 8 9 10 11 12 | 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; |
但是我在
下面得到了
ORA-01489: result of string concatenation is too long
01489. 00000 - "result of string concatenation is too long"
*Cause: String concatenation result is more than the maximum size.
*Action: Make sure that the result is less than the maximum size.
我抬起头,发现了使用to_clob的建议,但它仍然引发此错误。我正在使用oracle 11g。感谢您的提前帮助。
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
无需创建自定义功能。 Oracle已经提供了xmlagg功能。
您需要做的就是通过GetClobVal将输出转换为clob,并且还需要进行rtrim处理,因为它将在结果的最后返回定界符。
1 | SELECT RTRIM(XMLAGG(XMLELEMENT(E,colname,',').EXTRACT('//text()') ORDER BY colname).GetClobVal(),',') FROM tablename; |