У нас есть один (!) Клиент, для которого установка поля Oracle CLOB на NULL завершается с ошибкой
[FireDAC][Phys][Ora] ORA 22275 - Invalid LOB locator specified
Запрос, который отправляется в базу данных *, равен
update tt_hrs set
TT_INFO = ?
where
TT_HRS_ID = ?
Params:
0 - : <NULL>
1 - : 276727
Запрос набора данных через FireDAC показывает мне, что lDataset.Fields[i].DataType
для поля TT_HRS
равно ftWideMemo
.
Многие вещи, которые я нахожу в Интернете, связаны со «старым способом» (Oracle 8.0.5 IIRC) обновления CLOBS, где вы использовали
UPDATE ClobTable
SET
Value = EMPTY_CLOB()
WHERE
Id = :Id
RETURNING
Value
INTO
:Value
но AFAIK такого рода заявления больше не требуются.
В SQLPLUS я могу выполнить их без проблем в нашей собственной базе данных Oracle 12c, поэтому разница между EMPTY_CLOB()
и NULL
, похоже, не имеет значения:
update tt_hrs set tt_info='test' where tt_hrs_id=276727;
update tt_hrs set tt_info=NULL where tt_hrs_id=276727;
update tt_hrs set tt_info=empty_clob() where tt_hrs_id=276727;
- Как показывает сообщение об ошибке, мы используем FireDAC в Delphi Tokyo 10.2.2.
32-разрядное приложение для Windows.
- На поле нет ограничения NOT NULL, оно отсутствует в индексе,
триггеров нет.
- Клиент использует OracleDB12 Release 1.
- Наш код обновления генерируется FireDAC из TClientDataSet
подключен к сетке, которую пользователь редактирует.
Вопрос
Есть ли в настройках Oracle что-нибудь, что могло бы объяснить такое поведение?
Может быть, они установили какой-то «режим совместимости» для поддержки старых приложений или что-то ... Я недостаточно знаком с Oracle.
Примечание: это не было бы случайно связано с проблемой с 2-байтовыми символами Я сообщал ранее ?
Сжимая здесь соломинку ...
* Мы можем регистрировать это, потому что у нас есть потомок TDataSetProvider, который регистрирует то, что отправляется в переопределенном DoBeforeExecute
.