我有以下查询:
select id from table1 where some_func(?) = 1;
其中 some_func
是一个函数,它的参数可以是 VARCHAR2 或 CLOB,而 ?
是一些字符串,它可能很长。
我正在尝试使用以下代码来绑定(bind)变量:
stmt.setObject(i+1, obj);
但是在 string.length()
> 4000 的情况下,我得到以下错误:
java.sql.SQLException: ORA-01460: unimplemented or unreasonable conversion requested
原因很明显:VARCHAR2 大小限制为 4000 个字符。
然后我尝试使用以下代码:
if(obj instanceof String && ((String) obj).length() >= 4000) {
String s = (String) obj;
StringReader stringReader = new StringReader(s);
stmt.setClob(i+1, stringReader, s.length());
} else {
stmt.setObject(i+1, obj);
}
这给出了不同的错误:
ORA-22922: nonexistent LOB value
我尝试的最后一个想法是使用 oracle.sql.CLOB.createTemporary()
方法创建一个 CLOB,但由于以下异常而失败:
java.lang.ClassCastException:
org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
cannot be cast to oracle.jdbc.OracleConnection
我做错了什么?还有其他的可能性吗?
最佳答案
CLOB 可以用一种简单的方式创建:
if(obj instanceof String && ((String) obj).length() >= 4000) {
Clob clob = connection.createClob();
clob.setString(1, (String) obj);
stmt.setClob(i+1, clob);
}
当然应该释放这些 clob。
关于java - 使用 JDBC 从长字符串创建 CLOB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5067485/