龙空技术网

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

Java老油条 367

前言:

而今小伙伴们对“oracle数字转换为字符串”大约比较关切,大家都需要了解一些“oracle数字转换为字符串”的相关知识。那么小编在网络上汇集了一些对于“oracle数字转换为字符串””的相关内容,希望小伙伴们能喜欢,我们快快来了解一下吧!

业务场景

将照片转为数字长串后,由于字符过长,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( ' * @param original         处理超长字符串 * @param insertString     插入字符串 ') || TO_CLOB(' * @param interval         间隔的字符长度 2000 * @return */public static String stringInsertByInterval(String original, String insertString, int interval) {   if (original == null) return "";   Integer len = original.length();   if (interval >= len) return original;   String rtnString = original;   if (original.length() > interval) {      List<String> strList = new ArrayList<String>();      Pattern p = Pattern.compile("(.{" + interval + "}|.*)");      Matcher m = 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 + "')";   return rtnString;}

作者:赵小可

链接:

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签: #oracle数字转换为字符串