次のクエリがあります。
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
私は何を間違っていますか?これを行う他の可能性はありますか?