У меня следующий запрос:
select id from table1 where some_func(?) = 1;
, где some_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
Что я делаю не так? Есть ли другие способы сделать это?