6

我有以下查询:

select id from table1 where some_func(?) = 1;

wheresome_func是一个允许其参数为 VARCHAR2 或 CLOB 的函数,并且?是一些字符串,它可能非常长。

我正在尝试使用以下代码来绑定变量:

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

我究竟做错了什么?还有其他可能性吗?

4

2 回答 2

13

可以以简单的方式创建 CLOB:

if(obj instanceof String && ((String) obj).length() >= 4000) {
    Clob clob = connection.createClob();
    clob.setString(1, (String) obj);
    stmt.setClob(i+1, clob);
}

然后当然应该释放这些 clob。

于 2011-02-22T08:03:00.587 回答
1

根据我的经验,setCharacterStream() 比 setClob() 可靠得多

字符串 s = (字符串) obj;
StringReader stringReader = new StringReader(s);
stmt.setCharacterStream(i + 1, stringReader, s.length());

它无需创建 CLOB 对象即可工作

于 2011-02-21T15:09:14.027 回答