问题描述
系统在执行存储过程中出现:error试图在blob或者clob列上排序或比较的问题,如下图,首先通过技术平台的fqa,通过sp_set_para_value(1,'ENABLE_BLOB_CMP_FLAG',1)更改相关参数,并重启数据库,再次尝试执行存储过程,问题没有解决。生产环境报错,测试环境不报错。
生产环境信息
Select id_code() from dual;
Select build_version from v$instance;
问题分析
- 排查问题系统里是否有相关问题,排查到问题编号114975和遇到的问题是一直的,评审结论是:在2月月度版上确认存在,正常情况下,enable_blob_cmp_flag=1可以解决。
- 排查兼容模式设置:COMPATIBLE_MODE 配置是2,兼容oracle。另外一个测试环境版本1-2-128-22.08.12-166927-20005-ENT, COMPATIBLE_MODE配置是2,enable_blob_cmp_flag=1,但是查询没有报错,暂排除COMPATIBLE_MODE问题。
- 导出两个环境的dm.ini文件,做参数比对,看看差异在哪里?发现enable_blob_cmp_flag生产环境和测试环境参数的描述不一致。
- 生产环境:ENABLE_BLOB_CMP_FLAG = 1 #Whether BLOB/TEXT types are allowed to be compared;1:not allowed;2.allowed and text turn to char/varchar;3.allowed and char/varchar turn to text.
测试环境:ENABLE_BLOB_CMP_FLAG = 0 #Whether BLOB/TEXT types are allowed to be compared
最新的手册中描述:是否支持大字段类型的比较。 0:不支持; 1:支持,此时 DISTINCT、 ORDER BY、 分析函数和集函数支持对大字段进行处理, 且当大字段跟字符串比较时,让大字段转换成字符串类型; 2:支持,此时 DISTINCT、 ORDERBY、 分析函数和集函数支持对大字段进行处理, 且兼容 MYSQL 模式下,大字段跟字符串比较时,让字符串转换成大字段类型。- 尝试根据dm.ini说明去设置参数值,将enable_blob_cmp_flag=2,排序查询不报错。
- 尝试在其他版本测试,参数文件描述是:Whether BLOB/TEXT types are allowed to be compared;0:not allowed;1.allowed and text turn to char/varchar;2.allowed and char/varchar turn to text. 按照描述设置enable_blob_cmp_flag=1,排序查询不报错。
- 在相同版本复现问题:参数描述是:Whether BLOB/TEXT types are allowed to be compared;1:not allowed;2.allowed and text turn to char/varchar;3.allowed and char/varchar turn to text.
但是参数值设置为3时,是无效的参数值,参数设置为1和2时,排序查询没有问题。
问题结论
自行测试结果是enable_blob_cmp_flag参数的行为跟有些版本的dm.ini文件描述的不符,实际行为和手册描述相符,问题环境中出现行为和手册描述不符需要测试再次确认。
达梦技术社区:https://eco.dameng.com