oracle, clob类型查询提示:1. 字符串缓冲区太小 2. 数据类型不一致: 应为 -, 但却获得 CLOB的解决办法

问题出现场景:

首先是数据库定义某张表中的字段类型为CLOB,当以该字段作为查询条件拼接到where语句后面,会出现下面的提示:

或是将clob类型使用函数转换为char类型时,提示缓冲区太小的问题:

 

问题出现原因

首先CLOB类型是不能经过处理,直接作为判等的条件拼接在where 语句后面的

-- 假设id 为 clob类型 当前查询会报错
select t.id from account t where  t.id = '123';

报错的原因就是:

   “123” 为字符串,t.id是CLOB类型,是不能直接连接的


其次CLOB类型转换字符串格式(varchar2)后,由于varchar2存在4000的长度上限,所以需要通过限制长度才能查询

解决方法:

-- 假设id 为 clob类型 
select t.id from account t where  t.id = '123';

-- 方式一:substr控制长度
select t.id from account t where to_char(substr(t.id,0,4000))t.id = '123';

-- 方式二:dbms_lob.substr控制长度
select t.id from account t where to_char(dbms_lob.substr(t.id,4000,1))t.id = '123';

当然,假如当前的clob类型的变存放的是中文的话,由于中文占据两个字符的位置,所以上限需要除以2

-- 假设id 为 clob类型 
select t.id from account t where  t.id = '123';



-- 中文情况 substr 上限除以2
select t.id from account t where to_char(substr(t.id,0,4000))t.id = '123';

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值