业务场景
将照片转为数字长串后,由于字符过长,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;}