ORA-24816: Расширенные данные привязки не LONG предоставляются после фактического столбца LONG или LOB.

Я получаю следующее исключение при обновлении таблицы в Hibernate

ORA-24816: Расширенные данные привязки не LONG предоставляются после фактического столбца LONG или LOB.

Я также извлек sql-запрос, он выглядит так

Update table_name set columnName (LOB)=value, colmun2 (String with 4000)=value where id=?;

Класс сущности

class Test{

    @Lob
    private String errorText;

    @Column(length = 4000)
    private String text;
}

Помогите, пожалуйста, что здесь не так

Спасибо, Рави Кумар.


person 1097733    schedule 28.04.2014    source источник


Ответы (6)


Запуск oerr ora 24816 для получения подробной информации об ошибке дает:

$ oerr ora 24816
24816, ... "Expanded non LONG bind data supplied after actual LONG or LOB column"
// *Cause:  A Bind value of length potentially > 4000 bytes follows binding for
//          LOB or LONG.
// *Action: Re-order the binds so that the LONG bind or LOB binds are all
//          at the end of the bind list.

Таким образом, другим решением, которое использует только 1 запрос, будет перемещение ваших привязок LOB/LONG после всех ваших привязок не-LOB/LONG. Это может быть или не быть возможным с Hibernate. Возможно, что-то более похожее на:

update T set column2 (String with 4000)=:1, columnName (LOB)=:3 where id=:2;

Похоже, что это ограничение DML существует, по крайней мере, с Oracle 8i.

Ссылки:

person mormegil    schedule 03.10.2014

Я нашел проблему. 1. Когда спящий режим обновляет данные в БД, а объект имеет столбец из 4000 символов и столбец типа lob, тогда спящий режим выдает это исключение.

Я решил эту проблему, написав два запроса на обновление 1. Сначала я сохранил объект с помощью Update() 2. Написал еще один запрос на обновление для обновления столбца lob

Спасибо, Рави.

person 1097733    schedule 10.05.2014
comment
Другой альтернативный подход до hibernate 3 заключается в том, что вы можете переименовывать поля сущности, добавляя префикс как z_, таким образом, hibernate поместит все поля в конец оператора. - person 1097733; 29.09.2019

Я также столкнулся с такой же ошибкой в ​​oracle db и обнаружил, что Здесь исправлена ​​ошибка, связанная со спящим режимом

В моем случае мы уже использовали hiberante 4.3.7, но не упомянули, что поле Lob in Entity

Воспроизведение шагов

  1. Имейте поля с типом данных varchar2 и типом данных clob. Убедитесь, что имя вашего столбца находится в этом алфавитном порядке clob_field, varchar_two_field1, varchar_two_field2.
  2. Теперь обновите clob_field размером ‹ 2000 байт и varchar_two_field1 размером 4000 байт.
  3. Это должно закончиться ошибкой ORA-24816: расширенные данные привязки не LONG, предоставленные после фактического столбца LONG или LOB

Решение

  1. Убедитесь, что у вас гиберанте 4.1.8, ‹ 4.3.0.Beta1
  2. Аннотируйте свое поле clob/blob в соответствующем объекте как

    import javax.persistence.Lob;  
    ...
        @Lob
        @Column(name = "description")
        private String description;  
    ....
    

Если вы хотите увидеть разницу, после внесения вышеуказанных изменений включите отладку для операторов sql, установив "true" для "hibernate.show_sql" в файле persistence.xml.

person prem    schedule 01.04.2016

Я понимаю, что эта ветка довольно старая, но я решил поделиться своим опытом с тем же сообщением об ошибке здесь для дальнейшего использования.

У меня были точно такие же симптомы (например, ORA-24816) в течение нескольких дней. Меня немного отвлекли различные темы, с которыми я столкнулся, предполагая, что это связано с порядком привязки параметров. В моем случае это не было проблемой. Кроме того, я изо всех сил пытался воспроизвести эту ошибку, она возникла только после развертывания на сервере приложений, я не смог воспроизвести это с помощью интеграционных тестов.

Однако я взглянул на код, где я привязывал параметр, и нашел:

preparedStatement.setString(index, someStringValue);

Я заменил это на:

preparedStatement.setClob(index, new StringReader(someStringValue));

Это помогло мне.

Эта ветка 2009 года оказалась весьма полезной.

person Kristoffer    schedule 04.04.2018

Я столкнулся с этой проблемой сегодня, пытаясь вставить данные в таблицу. Чтобы избежать этой ошибки, просто оставьте все поля с типом данных "LOB" в конце оператора вставки.

Например

Table1 имеет 8 полей (Field1,Field2,.... Field8 и т.д..),

из которых

Field1 и Field2 имеют типы данных CLOB.

а остальные типы данных Varchar2

. Затем при вставке данных убедитесь, что вы сохраняете значения Field1 и Field2 в конце, как показано ниже.

 INSERT INTO TABLE1 ( Field3,Field4,Field5,Field6,Field7,Field8,Field1,Field2)  
    Values ('a','b','c','d','e','f','htgybyvvbshbhabjh','cbsdbvsb')
person ramana mavuluri    schedule 01.08.2017

Поместите привязку LOB в последнюю очередь. Посмотрим, решит ли это проблему..

person Srikrishnan Suresh    schedule 14.09.2017