本文于 97 天前发布,最后更新于 79 天前
一、问题描述
在达梦数据库中报错字符串截断存在多种情况,报错原因不一。
二、问题解决
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;
静态参数,修改后需重启数据库生效。
三、补充
如再有其他情况报错:字符串截断。发现后即同步到该文章。