6

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 oracle.jdbc.OracleConnection

What am I doing wrong? Are there any other possibilities to do this?

2
  • Have you tried the setCharacterStream method in PreparedStatement? Commented Feb 21, 2011 at 15:10
  • Yes, please look at my previous answer (a_horse_with_no_name was a bit faster) Commented Feb 21, 2011 at 15:30

2 Answers 2

13

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.

Sign up to request clarification or add additional context in comments.

1 Comment

When to use setString instead of setCharacterStream?
1

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

10 Comments

Unluckily, I get the same error as with strings: java.sql.SQLException: ORA-01460: unimplemented or unreasonable conversion requested
What datatype is the underlying column? I have no problem using this with CLOB columns.
This is just a parameter for the some_func function, which is 3rd-party software, so I do know only that it accepts CLOB or varchar2 as parameter.
You might be getting the VARCHAR2 version of the function. Use named parameters to make sure you're getting the one you expect.
I couldn't find a way to use named parameters with such a function so I tried to create a CLOB and succeeded. See my answer if you want to.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.