1 故障现象
研发反馈SQL 执行报如下错误:
从错误提示看是在LOB列上进行了排序或者比较,实际上表里并没有LOB列,只有2000 的VARCHAR。
2 解决方法
我们这里先看解决方法,在分析背后的原因。
解决方法就是修改参数ENABLE_BLOB_CMP_FLAG
值为1:
sp_set_para_value(1,’ENABLE_BLOB_CMP_FLAG’,1)
select * from v$dm_ini where para_name=’ENABLE_BLOB_CMP_FLAG’;
虽然是动态参数,但是修改后,依然需要新建连接才生效;所以,修改参数后,依然需要重启应用或者重启数据库服务器。
官方文档里对该参数的说明:
ENABLE_BLOB_CMP_FLAG: 动态参数,可以在会话级别直接修改。 用来控制DB是否支持大字段类型的比较。0:不支持;1:支持,此时 DISTINCT、ORDER BY、 分析函数和集函数支持对大字段进行处理。
这里还需要注意一点,DM8 版本更新比较快,我们这里是在 1-2-114-22.03.04-158322-10045-ENT
的版本里。 但是需要在更高级别的文档里才能查看到该参数,低版本的文档里是看不到这个参数。
3 分析背后原因
在之前的博客,我们分析过列超长的问题,如下:
DM 达梦数据库 记录超长 错误解决方法
https://www.cndba.cn/dave/article/108596
基表中,若没有指定 USING LONG ROW 存储选项时,插入 VARCHAR 数据类型的实际最大存储长度由数据库页面大小决定;如果指定了 USING LONG ROW 存储选项,则插入 VARCHAR 数据类型的长度不受数据库页面大小限制。VARCHAR 类型在表达式计算中的长度上限不受页面大小限制,为 32767。
我们表设计的时候,列的长度是2000,当超过2000,有可能默认转换成text了,因为一行不能超过32k。
但这个和我们报错貌似还并没有关系,我们查看官方手册,这两种类型的定义:
- CLOB类型用于指明变长的字符串,长度最大为 2G-1字节。
- TEXT变长字符串类型,其字符串的长度最大为 2G-1,可用于存储长的文本串。
因此我们可以推测在数据库内部,TEXT 应该是等同于CLOB。所以才会有我们之前的错误:
[-2685]:试图在blob或者clob列上排序或比较。
其实要避免这个问题,除了启用ENABLE_BLOB_CMP_FLAG参数外,也可以将VARCHAR的长度适当缩小一点。
版权声明:本文为博主原创文章,未经博主允许不得转载。