首页>>后端>>java->java往oracle存clob类型的值时,字符长度过长怎么办?

java往oracle存clob类型的值时,字符长度过长怎么办?

时间:2023-12-01 本站 点击:0

业务场景

将照片转为数字长串后,由于字符过长,java往数据库中直接存为clob字段时,oracle会报ORA-01704问题:字符串文字过长。

这是因为一般对含有CLOB字段的数据操作。

如果CLOB字段的内容非常大的时候,会导致SQL语句过长。

隐式转换:oracle默认把字符串转换成varchar2类型,varchar2类型最大字符串的长度为4000,当字段长度比4000大时,所以会报ora-01704错误。

简言之,就是两个单引号之间的字符长度不能超过4000。

解决办法总结

试过几种办法,发现只有最后一种是有效的,现将错误与正确的方法都进行了总结,错误的进行避免,正确的可以借鉴。

1.将字符串按照固定长度截取,insert语句:to_clob('字符1' || '字符2' || '字符3' || '字符4' .......),此方法无效,隐式转换成了varchar2,字符长度超过4000;

2.将超长字段按照一定的长度进行截取,用to_clob()函数拼接insert语句,将截取的字符用连接符 ‘||’ 连接起来存入clob字段中,insert语句:to_clob('字符1') || to_clob('字符2') || to_clob('字符3') || to_clob('字符4') ....... 此方法有效。

/***将超长的内容转为clob可以保存的句式*字符串每隔2000长度插入指定字符串')||TO_CLOB('*@paramoriginal处理超长字符串*@paraminsertString插入字符串')||TO_CLOB('*@paraminterval间隔的字符长度2000*@return*/publicstaticStringstringInsertByInterval(Stringoriginal,StringinsertString,intinterval){if(original==null)return"";Integerlen=original.length();if(interval>=len)returnoriginal;StringrtnString=original;if(original.length()>interval){List<String>strList=newArrayList<String>();Patternp=Pattern.compile("(.{"+interval+"}|.*)");Matcherm=p.matcher(original);while(m.find()){strList.add(m.group());}strList=strList.subList(0,strList.size()-1);rtnString=StringUtils.join(strList,insertString);}rtnString=“'TO_CLOB('”+rtnString+"')";returnrtnString;}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/java/5460.html