版权声明:本文为博主原创文章,未经博主允许不得转载。
在日常开发中,经常遇到存储字段大于4000字节的情况,这时候,就要考虑到clob字段了,而最长见的异常就是 "ORA-22835:缓冲区对于CLOB到CHAR转换而言太小"了,那么该如何解决呢???
创建表
CREATE TABLE clobtest(
id NUMBER(19) not null,
text_max CLOB
)
插入内容sql
INSERT INTO clobtest(ID,text_clob) VALUES (#{id} ,#{str,jdbcType=CLOB})
查看内容sql
select text_clob from clobtestwhere id=#{0}
mapper层此处省略... ...
测试类
测试插入
@Test
public void testInsert(){
try {
StringBuilder sb = new StringBuilder();
for (int i = 0; i <30000; i++) {
sb.append(i+",");
}
String str = sb.toString();
//插入数据库
int a = gbossInvokeMapper.testInsert(str);
System.out.println(a);
} catch (Exception e) {
e.printStackTrace();
}
}
测试查询
如果用to_char去转换的话,则可能出现"ORA-22835:缓冲区对于CLOB到CHAR转换而言太小"异常
select to_char(text_clob) text_clob from clobtestwhere id=#{0}//不可用
解决方案
@Test
public void textRead(){
try {
String reString = "";
//读取数据库内容
Map<String, Object> map = gbossInvokeMapper.textRead();
ClobProxyImpl c = (ClobProxyImpl)map.get("TEXT_MAX");
Reader r = c.getCharacterStream();
BufferedReader br = new BufferedReader(r);
String s = br.readLine();
StringBuffer sb = new StringBuffer();
while (s != null) {
// 执行循环将字符串全部取出付值给StringBuffer由StringBuffer转成STRING
sb.append(s);
s = br.readLine();
}
reString = sb.toString();
if(br!=null){
br.close();
}
if(r!=null){
r.close();
}
System.out.println(reString);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("over");
}