Create CLOB from long string using JDBC
I have the following query:
select id from table1 where some_func(?) = 1;
where some_func
is a function which allows its arguments to be either VARCHAR2 or CLOB, and ?
is some string, which could be really long.
I am trying to use the following code to bind variables:
stmt.setObject(i+1, obj);
but in case of string.length()
> 4000 I get the following error:
java.sql.SQLException: ORA-01460: unimplemented or unreasonable conversion requested
for an obvious reason: the VARCHAR2 size limit is 4000 characters.
I then tried to use the following code:
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);
}
which gave a different error:
ORA-22922: nonexistent LOB value
The last idea I tried was to create a CLOB using oracle.sql.CLOB.createTemporary()
method but it failed because of the following exception:
java.lang.ClassCastException:
org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
cannot be cast to开发者_C百科 oracle.jdbc.OracleConnection
What am I doing wrong? Are there any other possibilities to do this?
The CLOB could be created in a simple manner:
if(obj instanceof String && ((String) obj).length() >= 4000) {
Clob clob = connection.createClob();
clob.setString(1, (String) obj);
stmt.setClob(i+1, clob);
}
Then these clobs should be freed of course.
From my experience setCharacterStream() is much more reliable than setClob()
String s = (String) obj; StringReader stringReader = new StringReader(s); stmt.setCharacterStream(i + 1, stringReader , s.length());
and it works without the need to create CLOB objects
精彩评论