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

私が試した最後のアイデアは、メソッドを使用して CLOB を作成するoracle.sql.CLOB.createTemporary()ことでしたが、次の例外のために失敗しました:

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 = 新しい StringReader(s);
stmt.setCharacterStream(i + 1, stringReader , s.length());

CLOB オブジェクトを作成しなくても機能します。

于 2011-02-21T15:09:14.027 に答える