ORA——00600错误的原因是:(Oracle中对clob类型字段的操作)
改正的代码如下:
//3.2生成数据插入语句 (增加的方式)
StringBuilder insertSql = new StringBuilder(“INSERT INTO “);
insertSql.append(tableName);
insertSql.append(” ( “);
StringBuilder paramSql = new StringBuilder(” values (”);
for(int i = 0 ; i < colList.size() ; i++){
if(i<(colList.size()-1)){
if(colList.get(i).toUpperCase().equals("ACCEPTLIST")){
insertSql.append(colList.get(i));
insertSql.append(",");
paramSql.append("empty_clob()");
paramSql.append(",");
}else{
insertSql.append(colList.get(i));
insertSql.append(",");
paramSql.append("?");
paramSql.append(",");
}
}else{
if(colList.get(i).toUpperCase().equals("ACCEPTLIST")){
insertSql.append(colList.get(i));
insertSql.append(")");
paramSql.append("empty_clob()");
paramSql.append(")");
}else{
insertSql.append(colList.get(i));
insertSql.append(")");
paramSql.append("?");
paramSql.append(")");
}
}
}
——————————————————————————————————————————————————————————
这个是别人的解释,我觉得概括的完全正确我就拿过来了:
第一,LOB数据不能象其它类型数据一样直接插入(INSERT)。插入前必须先插入一个空的LOB对象,CLOB类型的空对象为EMPTY_CLOB(),BLOB类型的空对象为EMPTY_BLOB()。之后通过SELECT命令查询得到先前插入的记录并锁定,继而将空对象修改为所要插入的LOB对象。
第二,在插入到更新之间一定要将自动提交设为false否则,再次查找时就不能正确更新,查找时一定要用select XXX from table where id=‘XXX’ for update 如果不加for update会报:“row containing the LOB value is not locked”;如果在插入前没有将自动提交设为false会报“fetch out of sequence ”。注意到以上两点一般就可以顺利插入clob型字段了。