在 gbase8s 早期版本 clob数据类型并不支持直接的 等值比较
select * from tab where clob ='123'
近期在某现场使用早期的gbase8s项目中遇到了 需要等值比较clob 的问题
为满足对于LOB类型数据的操作,gbase8s提供了 多组处理LOB类型的函数
按照项目现场的需求
可以 先将 clob转换成varchar 类型在做等值比较 其中 varchar 不超过32765
在使用处理LOB 函数时遇见如下问题
create table zz(c1 clob); 插入 'aaaaaaa'
drop function if exists dbms_lob_getlength;
create function 'gbasedbt'.dbms_lob_getlength (clob)
returns integer
external name '$GBASEDBTDIR/extend/excompat.1.0/excompat.bld(dbms_lob_getlength)' language c;
drop function if exists dbms_lob_substr;
create function 'gbasedbt'.dbms_lob_substr (clob,integer default 32765,integer default 1)
returns varchar(32765)
external name '$GBASEDBTDIR/extend/excompat.1.0/excompat.bld(dbms_lob_substr)' language c;
drop function if exists clob_to_str;
create function 'gbasedbt'.clob_to_str(pclob clob)
returns varchar(32765)
return dbms_lob_substr(pclob, LEAST(dbms_lob_getlength(pclob),32765),1);
end function;
具体逻辑为 先获取到 CLOB类型的数据长度 ,再将 CLOB类型转换为 varchar
但是在进行等值查询时 select * from zz where clob_to_str(c1) = 'aaaaaaa';
返回null;
直接查询 clob_to_str(c1) 时 又显示 'aaaaaaa'
将查询到的结果直接unload 到文本文件中 发现 在最后追加了一个换行符,导致等值比较返回空
处理方案
一 使用 gbase8s提供的擦除函数将末尾回车擦除
二 获取clob长度时 -1
drop function if exists clob_to_str;
create function 'gbasedbt'.clob_to_str(pclob clob)
returns varchar(32765)
return dbms_lob_substr(pclob, LEAST(dbms_lob_getlength(pclob)-1,32765),1);
end function;