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