问题描述:
在Mybatis 操作CLOB 的时候遇到了错误,ORA-00932:数据类型不一致:应为-,但却获得CLOB
或者是利用union 查询返回数据缓冲区太小等问题
问题定位:
1. 看看操作clob 字段的时候用到了Union 了吗?
原因: clob 字段不支持分类,union 关键字会对字段进行group by , 这个隐藏从错误很难发现,
注意: 用union all 可以,但是不能用 uion;
2:用to_char(clob 字段) 可以解决问题,但是不是长久之计;
我一开始的时候用到就是to_char(); 总以为自己sql 没有问题; 而且to_char() 也不会暴露这个问题的;
3:查询clob字段时使用dbms_lob.substr(clob字段) 也可以返回数据 不过有长度限制4000
4:Oracle数据库中有一个字段是CLOB类型,java简单解析不了。去查找了一下解决方案,试了好几种,下面的这种是有效的。
public String ClobToString(Clob clob) throws SQLException, IOException {
String reString = "";
Reader is = clob.getCharacterStream();// 得到流
BufferedReader br = new BufferedReader(is);
String s = br.readLine();
StringBuffer sb = new StringBuffer();
while (s != null) {// 执行循环将字符串全部取出付值给StringBuffer由StringBuffer转成STRING
sb.append(s);
s = br.readLine();
}
reString = sb.toString();
return reString;
}
}
此处的Clob是java.sql.Clob字段。
但是我们从数据库中取出的时候是CLOB字段。所以我们需要强制转换一下,在调用该方法的时候:
String competitive = ClobToString((Clob)map.get("COMPETITIVEBRAND"));