Создать CLOB из длинной строки, используя JDBC - PullRequest
6 голосов
/ 21 февраля 2011

У меня следующий запрос:

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

Что я делаю не так? Есть ли другие способы сделать это?

Ответы [ 2 ]

12 голосов
/ 22 февраля 2011

CLOB можно создать простым способом:

if(obj instanceof String && ((String) obj).length() >= 4000) {
    Clob clob = connection.createClob();
    clob.setString(1, (String) obj);
    stmt.setClob(i+1, clob);
}

Тогда эти сгустки, конечно, должны быть освобождены.

1 голос
/ 21 февраля 2011

По моему опыту setCharacterStream () гораздо надежнее, чем setClob ()

String s = (String) obj;
StringReader stringReader = new StringReader(s);
stmt.setCharacterStream(i + 1, stringReader , s.length());

и работает без необходимости создания объектов CLOB

...