преодолеть предел 32 КБ при вставке параметра oracle clob IN с использованием Spring StoredProcedure

Среда: oracle 11g, spring-jdbc-3.2.2-RELEASE.jar, JDK 1.7, драйвер Oracle UCP.

У меня есть хранимая процедура, которая вставляет запись в таблицу со столбцом CLOB. SP имеет входной аргумент CLOB среди других аргументов IN и OUT. Мой код Java использует Spring StoredProcedure для вызова хранимой процедуры:

public class MyClass extends StoredProcedure {
    public MyClass(){
       .....
       declareParameter(new SqlParameter("content", Types.CLOB));
       .....
    }

    public void insert(){
       HashMap<String,Object> params = new HashMap<String, Object>(37);
       String bigContent = ....; // which contains ASCII chars in my test
       ....
       params.put("content", new SqlLobValue(bigContent));
       ....
       execute(params);
    }
}

Код отлично работает, если в bigContent ‹ 32 тыс. символов. Если в bigContent есть, скажем, 50 тысяч символов, это не сработает. Я также протестировал использование jdbcTemplate и SqlLobValue для прямой вставки в таблицу, все работает нормально, если bigContent имеет 50 тыс. символов.

Я хочу использовать SP, так как он делает множество других вещей и более эффективен, чем вызов нескольких SQL-операторов вставки, обновления и запроса по отдельности.

Кто-нибудь знает, как заставить его работать с SP? Или это предел, который я должен обрабатывать по-другому, если в bigContent> 32K символов?


person wang.aurora    schedule 26.04.2015    source источник
comment
Насколько я понимаю, Oracle не устанавливает ограничение в 32 КБ для аргумента хранимой процедуры CLOB IN для библиотек программирования. Вероятно, это проблема стороны Spring.   -  person wang.aurora    schedule 26.04.2015


Ответы (4)


PL/SQL имеет жесткое ограничение в 32 тыс. символов, если вы отправляете данные в виде строки символов. Если параметр является CLOB, вы можете сначала создать временный LOB, заполнить его данными, а затем вызвать процедуру PL/SQL с объектом CLOB.

person Jean de Lavarene    schedule 06.05.2015

Это зависит от вашей версии Oracle:

  • ‹ 10.1: вы можете поместить свойство SetBigStringTryClob в true в вашем DriverManager.
  • >= 10.1: вы можете использовать OraclePreparedStatement.setStringForClob документ здесь< /а>.

Кроме того, вам может помочь эта статья.

person grebesche    schedule 26.04.2015

Ограничение для CLOB в Oracle составляет 176 ТБ. 32 КБ - это предел для VARCHAR. Ваш код где-то использует неявное преобразование из VARCHAR в CLOB. В Oracle CLOB должен быть параметр OUTPUT - даже если вы его вставляете. API Oracle предполагает, что вы создаете empty_clob() на стороне базы данных, а затем возвращаете локатор LOB в приложение. Затем приложение использует этот локатор LOB в качестве дескриптора файла.

Это поведение отличается от других баз данных.

person ibre5041    schedule 26.04.2015

У нас была похожая проблема, но потом мы обнаружили основную причину внутри PL/SQL — смешивание типов VARCHAR2 и CLOB для большого параметра.

Итак, наконец, мы оставили код Java таким, какой он был, даже используя String, а не Clob для передачи большого параметра в Java (используя Spring StoredProcedure).

person Vaclav Bartacek    schedule 07.04.2021