java - 使用 JDBC 从长字符串创建 CLOB

标签 java oracle jdbc clob

我有以下查询:

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/

相关文章:

线程的 Java 垃圾收集

java - 将文件 DSN 与 JDBC 一起使用

java - 如何使用 JDBC Appender 将错误日志保存到数据库中

java - Apache ivy 与 Eclipse 和多个项目

java - 如何为 GET 方法设置 http header "Accept"

oracle - 如何让我的 DBA 暂停并恢复更新大表中每一行的存储过程?

c# - 各种对象的可重复逻辑

database - 高性能数据库更新(Oracle)

java - 如何将 SQLite 与 Java 连接起来?

java - 退出应用程序时Android停止服务