oracle ORA-01704问题(clob字段insert报错)

今天遇到一个特殊情况,由于项目新增了防xss攻击的filter(使用antisamy),导致前台的富文本编辑框不能正确保存,html格式被过滤处理,保存后的数据无法被前台正确渲染从而导致显示乱码问题。为了临时解决问题,用户要求我把富文本数据手动刷进数据库。
这也不是一件复杂的事情,首先把filter关掉,然后正常操作,之后导出正确保存的数据,把数据导入产线环境就可以了。前台页面在读取数据的时候并不会调用filter,所以显示不会有问题。
但实际做insert操作的时候,sql报错:

ORA-01704: string literal too long

看到这个报错首先一拍脑袋,又在简单的地方踩坑了。oralce在处理sql的时候,会把传入的字符串转化为varchar2处理,varchar2的最大长度是4000,如果insert语句中单个字符串的长度超过4000,那就肯定会报错。也怪我太久没处理过clob字段数据,把这事儿给忘了。
解决这个问题也并不复杂,有两种比较简单的方式:一种是拼接字符串;一种是绑定变量。
拼接字符串的处理非常的简单粗暴,就是把超长的字符串切分成若干个长度不超过4000的子串,逐个update进去。比如这么写:

update usertable set name='abcdefg' where userId = 'aaa';
update usertable set name = name||'hijklmn' where userId = 'aaa';

这样子只要每一次拼接进去的字符串长度不超过4000,就不会报错,非常的简单。但是如果字符串的长度达到5位数,那显然实际操作起来就太麻烦。这时候就要采取第二种办法,绑定变量。
绑定变量也不复杂,就是把要插入的字符串先绑定给一个变量,然后在insert或者update语句中用变量代替实际字符串执行,就不会报错。写法如下:

declare
cntent clob :='abcdefg';
begin
    insert into table usertable values('aaa',content);
    end

富文本字段实在是太长了,于是我选择了第二种写法,数据就能正常插入了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值