Создать 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

Вы пробовали метод setCharacterStream в PreparedStatement?

Другие вопросы по тегам