本文于 16 天前发布,最后更新于 10 天前
一、问题描述
在达梦数据库中报错字符串截断存在多种情况,报错原因不一。
二、问题解决
2.1 大字段模糊查询
当查询条件中字段为TEXT,并进行LIKE模糊查询时报错。
报错原因是因为存在隐式转换,转换时截断而导致报错。
解决方法一
首先,查看一下该大字段长度
SELECT DBMSLOB.GETLENGTH(字段);
再根据长度尝试修改参数CLOB_LIKE_MAX_LEN
【静态参数】的值,并重启数据库。
CLOB_LIKE_MAX_LEN:LIKE 语句中 CLOB 类型的最大长度,单位 KB,取值范围 8~102400。
修改SQL
SP_SET_PARA_VALUE(2, 'CLOB_LIKE_MAX_LEN', 20480);
--或者
ALTER SYSTEM SET 'CLOB_LIKE_MAX_LEN' = 20480 SPFILE;
解决方法二
通过包的方法DBMS_LOB.SUBSTR
可以避免报错
SELECT 1 WHERE DBMS_LOB.SUBSTR(TEXT_COLUMN) LIKE '%XXX%';
2.2 WM_CONCAT/LISTAGG 拼接
当使用WM_CONCAT/LISTAGG进行字符串拼接,拼接太多时报错。
报错原因是因为WM_CONCAT/LISTAGG函数返回类型为VARCHAR类型,所以有截断的可能。
解决方法一
使用LISTAGG2集函数替换WM_CONCAT/LISTAGG函数
SELECT LISTAGG2(NAME, ', ') WITHIN GROUP (ORDER BY NAME) AS "拼接结果" FROM PRODUCTION.PRODUCT;
注意
1.WM_CONCAT 也可以写成 WMSYS.WM_CONCAT
2.WM_CONCAT 和 LISTAGG 返回类型为 VARCHAR
3.LISTAGG2 返回类型为 CLOB
解决方法二
后续版本可以通过修改参数WM_CONCAT_LOB
【静态参数】指定WM_CONCAT
函数的返回值类型。0:VARCHAR 类型;1:CLOB 类型
修改SQL
SP_SET_PARA_VALUE(2, 'WM_CONCAT_LOB', 1);
--或者
ALTER SYSTEM SET 'WM_CONCAT_LOB' = 1 SPFILE;
静态参数,修改后需重启数据库生效。
三、补充
如再有其他情况报错:字符串截断。发现后即同步到该文章。