Создать CLOB из длинной строки для JDBC
У меня следующий запрос:
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: запрошено невыполненное или необоснованное преобразование, что довольно очевидно: ограничение 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: несуществующее значение LOB
Затем я попробовал свою последнюю идею: просто создать CLOB с помощью метода oracle.sql.CLOB.createTeilitary, но мне не удалось из-за следующего исключения:
java.lang.ClassCastException: org.apache.commons.dbcp.PoolingDataSource $ PoolGuardConnectionWrapper не может быть приведен к oracle.jdbc.OracleConnection.
Что я делаю неправильно? Есть ли другие возможности сделать это?
3 ответа
Решение
CLOB может быть создан простым способом:
if(obj instanceof String && ((String) obj).length() >= 4000) {
Clob clob = connection.createClob();
clob.setString(1, (String) obj);
stmt.setClob(i+1, clob);
}
Тогда эти сгустки должны быть освобождены, конечно.
Из моего опыта setCharacterStream () гораздо надежнее, чем setClob ()
Строка s = (Строка) obj; StringReader stringReader = new StringReader(s); stmt.setCharacterStream(i + 1, stringReader, s.length());
и это работает без необходимости создавать объекты CLOB