gbase8s早期版本CLOB 等值比较问题

在 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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值