线上遇到bug,日志显示错误ORA-64203: Destination buffer too small to hold CLOB data after character set conversion,目标缓冲区太小, 无法容纳字符集转换之后的 CLOB 数据。
sql如下:
select to_char(rtrim(substr(xmlagg(xmlparse(content zy || ',' wellformed) order by zy).getclobval(),0,4000),','))
from UT_CW_KMMXZ
sql中使用 xmlagg拼接字符串,xmlagg(xmlparse(content 内容 || ',' wellformed) order by 字段).getclobval(),没有问题。
问题出在to_char()函数,to_char()转换字符串时最大长度为4000,但是zy字段中包含中文,生产数据库字符集为UTF-8,通过查询中文占用的字节长度得知1个汉字占用3个字节,substr截取4000个字符中包含汉字,长度大于4000,因此报错。
SQL> SELECT LENGTH('您好') FROM DUAL;
LENGTH('您好')
--------------
2
SQL> SELECT LENGTHB('您好') FROM DUAL;
LENGTHB('您好')
---------------
6
修改为substr截取1300个字符,to_char()转换时正常,问题解决!
select to_char(rtrim(substr(xmlagg(xmlparse(content zy || ',' wellformed) order by zy).getclobval(),0,1300),','))
from UT_CW_KMMXZ