注册
达梦数据库"-2685:试图在blob或者clob列上排序或比较"
专栏/LeeWen的铺子/ 文章详情 /

达梦数据库"-2685:试图在blob或者clob列上排序或比较"

LeeWen 2021/12/20 4254 6 0
摘要 在DM8上对大字段类型列进行排序、分组等操作时,会报错`-2685:试图在blob或者clob列上排序或比较`。

描述

在DM8上对大字段类型列进行排序、分组等操作时,会报错-2685:试图在blob或者clob列上排序或比较

示例演示

创建测试表并插入数据

create table T (ID int ,C1 TEXT); INSERT INTO T VALUES(1,'新华社北京12月5日电 题:步履坚定,共绘高质量发展新篇章——各地贯彻党的十九届六中全会精神纪实 新华社记者 发展,是解决一切问题的总钥匙。 党的十九届六中全会审议通过《中共中央关于党的百年奋斗重大成就和历史经验的决议》强调,必须实现创新成为第一动力、协调成为内生特点、绿色成为普遍形态、开放成为必由之路、共享成为根本目的的高质量发展。 近日新华社记者奔赴多地,到企业车间、基层一线、群众当中,亲历贯彻全会精神的火热气象,感受落实新发展理念蔚然成风。 提质增效,跃上发展新台阶 走进济钢集团,黑色钢铁已不见踪影。36岁的技术人员陈书超身着白大褂,正操作数控机床加工直径几微米的精密零部件。 对于转型发展,他有着切身收获:“企业从‘靠钢吃饭’到‘无钢发展’,我的工作也从铸造‘大黑粗’变成加工‘高精尖’,环境好了,收入也高了。” 2017年,有着60年历史的济钢关停全部钢铁生产线。如今,济钢度过转型阵痛,向新材料、高端装备制造转型。2021年,集团产值预计和退出钢铁产能前相当,但能耗、大气污染物排放均只有以前的“零头”。 “要努力提升技能,适应企业转型的新需要,以实际行动响应全会关于推动高质量发展的号召。”陈书超说。'); COMMIT;

image-20211219233802059

对大字段类型列进行排序和分组操作

SQL语句如下:

select c1,count(*) from T group by c1;
SELECT ID,C1 FROM T ORDER BY C1;

image-20211219225606595

可以观察到,对C1列进行排序和排序操作均报错"[-2685]:试图在blob或者clob列上排序或比较."

处理办法

1、修改数据库参数ENABLE_BLOB_CMP_FLAG

参数说明

将数据库参数ENABLE_BLOB_CMP_FLAG设置为1后,数据库支持DISTINCT、ORDER BY、分析函数和集函数支持对大字段进行处理。

ENABLE_BLOB_CMP_FLAG: 是否支持大字段类型的比较。0:不支持;1:支持。设置为1后支持DISTINCT、ORDER BY、分析函数和集函数支持对大字段进行处理。

注意:该参数并不能支持GROUP BY 对大字段进行处理。

测试

1、将ENABLE_BLOB_CMP_FLAG参数设置为1

sp_set_para_value(1,'ENABLE_BLOB_CMP_FLAG',1);

2、新开会话,执行order by SQL语句

image-20211219230425031

3、执行group by SQL语句

group by 语句还是会报错,报错信息为"[-6116]:无法比较的数据类型."

image-20211219230552054

所以设置ENABLE_BLOB_CMP_FLAG为1,并不能解决GROUP BY语句报错的问题。

2、将大字段类型转换为字符串类型

通过上面测试,GROUP BY 无法通过修改ENABLE_BLOB_CMP_FLAG参数来支持,所以需要将对应的大对象列转换为字符串类型进行处理。

使用CAST将字段类型转换为字符串类型

SQL语句如下:

SELECT ID,CAST(C1 AS VARCHAR) FROM T ORDER BY CAST(C1 AS VARCHAR); SELECT CAST(C1 AS VARCHAR), COUNT(*) FROM T GROUP BY CAST(C1 AS VARCHAR);

image-20211219231823139

image-20211219231837265

可以观察到,通过CAST将大字段列转换为字符串类型之后,ORDER BY 、GROUP BY 操作均可以执行。

使用DBMS_LOB.SUBSTR函数

DBMS_LOB.SUBSTR函数对CLOB或者TEXT类型,返回的结果为字符串类型,具体细节请参考《DM8 系统包使用》。

SQL语句如下:

SELECT ID,DBMS_LOB.SUBSTR(C1) FROM T ORDER BY DBMS_LOB.SUBSTR(C1);
select DBMS_LOB.SUBSTR(C1),count(*) from T group by DBMS_LOB.SUBSTR(C1);

image-20211219232454898

image-20211219232505378

可以观察到,使用DBMS_LOB.SUBSTR函数后,对于ORDER BY 、GROUP BY 操作均可以执行。

限制条件

1、使用第一种方法,修改数据库参数的方式,无法支持GROUP BY 对大字段的处理。

2、使用第二种方法,通过转换大字段类型为字符串类型可以达到相应的效果,但是如果大字段的内容长度比较长超过32767,内容会自动截断。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服