Informix: ошибка оператора обновления в WebSphere - PullRequest
1 голос
/ 22 декабря 2011

Я пытаюсь запустить это заявление об обновлении, но informix не позволяет мне.

У меня есть таблица с именем ITEMS, и ниже я выбрал несколько записей из нее.

SELECT SHORT_SKU, ITEMS."STYLE" FROM ITEMS;

SHORT_SKU        STYLE
---------        -----
01846173         null
01811752         null
01811748         null

При попытке выполнить приведенную ниже инструкцию UPDATE, informix сообщает об ошибке синтаксиса.

UPDATE ITEMS SET ITEMS."STYLE" = 'M' WHERE SHORT_SKU = '01846173';
                      ^ syntax error here

Затем я изменил (как показано ниже) и получил «Столбец (стиль) не найден ни в одной таблице в запросе (или SLV не определен).»

UPDATE ITEMS SET STYLE = 'M' WHERE SHORT_SKU = '01846173';

Как обновить поле "СТИЛЬ"?

ОБНОВЛЕНИЕ 1 Я изменил одно из пользовательских свойств источника данных WAS, ifxDELIMIDENT. Первоначально это было пустым. Итак, я изменил это на истину. Перезапущен был. И я не мог войти в наше приложение. SQLExceptions были выброшены WAS, но не смогли увидеть трассировку стека, потому что WAS урезал последние несколько строк. После изменения свойства обратно на пустое я смог войти в наше приложение.

Я попробовал другой подход, который заключался в написании Java-класса, который обновляет столбец ITEMMST.STYLE. Я выполнил это из сценария оболочки. В сценарии оболочки я определил и экспортировал переменную DELIMIDENT со значением «Y». Но я все еще получаю «Синтаксическая ошибка».

ОБНОВЛЕНИЕ 2 Мне удалось обновить столбец. Это делается путем добавления свойства «DELIMIDENT = Y» в конце строки соединения, которое будет передано объекту DriverManager при открытии соединения с базой данных.

Но это не сработает для нашего веб-приложения, поскольку оно использует источник данных WebSphere для создания соединения БД. Было бы супер, если бы есть способ установить это свойство в самой среде Informix.

Ответы [ 5 ]

0 голосов
/ 29 февраля 2012

Для этого есть 2 решения.

  1. Установите для свойства источника данных Informix JDBC 'ifxDELIMIDENT' значение 'true'
  2. Переименовать затронутые столбцы таблицы

Для 1-го варианта у нас возникла проблема после установки источника данных на «true». Внезапно все наши запросы не сработали. После долгих ошибок мы обнаружили, что, установив свойство ifxDELIMIDENT в значение true, оно также изменило Informix, чтобы оно чувствительно к регистру. В нашем Java-коде у нас есть все имена столбцов в верхнем регистре и в Informix (Пример: resultSet.getString ("STYLE")), но имена столбцов таблицы строчные (Пример: 'стиль'). Вот почему после изменения этого свойства мы не смогли войти в наше приложение. К сожалению, такое поведение не было задокументировано ни в информационном центре IBM, ни в Интернете.

Мы выбрали 2-й вариант, который включал изменение имен столбцов, на которые влияют, на другое имя столбца (например: «STYLE» изменен на «ITEM_STYLE»).

0 голосов
/ 22 декабря 2011

Мне не известно, что STYLE является ключевым словом в Informix (но я не собирался его искать).Тем не менее, вы обычно можете использовать ключевые слова в качестве имен столбцов и т. Д. Без особых проблем.

Если вы должны заключить его в кавычки, вам нужно установить переменную среды DELIMIDENT - значение не имеет значения, но используйте DELIMIDENT = 1 для конкретности,Это позволяет использовать стандартные SQL-идентификаторы с разделителями, где двойные кавычки окружают идентификаторы (имена столбцов, имена таблиц и т. Д.) И одинарные кавычки окружают строки.(Обычно вы можете использовать одинарные или двойные кавычки вокруг строк.)

Еще один момент: если вы используете идентификаторы с разделителями, они также становятся чувствительными к регистру (тогда как обычно идентификаторы не чувствительны к регистру).Поэтому вам нужно знать, как столбец STYLE хранится в системном каталоге.В большинстве баз данных они будут в нижнем регистре.Существует внешняя вероятность, что в базе данных MODE ANSI они хранятся в верхнем регистре (но я уже давно это проверял).

0 голосов
/ 22 декабря 2011

Попробуйте:

UPDATE ITEMS SET "STYLE" = 'M' WHERE SHORT_SKU = '01846173';

Должно быть, STYLE - зарезервированное слово, поэтому вы должны заключить его в двойную кавычку, чтобы обратиться к столбцу. Но стандартный синтаксис UPDATE не позволяет префиксировать имена столбцов с именем таблицы в предложении SET (поскольку вы можете обновлять только столбцы одной таблицы: таблица, упомянутая в UPDATE).

0 голосов
/ 22 декабря 2011

Правильный синтаксис будет

UPDATE ITEMS SET STYLE = 'M' WHERE SHORT_SKU = '01846173';

Как указано в Документация IBM , но STYLE - это зарезервированное слово Я думаю, у вас возникли проблемы, прочитайте Рекомендация IBM по этому вопросу.

В любом случае вы можете найти работу вокруг овса по этой ссылке , в противном случае вы можете рассмотреть возможность изменения имени столбца.

0 голосов
/ 22 декабря 2011

Используйте этот запрос:

UPDATE ITEMS SET ITEMS.STYLE = 'M' WHERE SHORT_SKU = '01846173';

Я думаю, двойные кавычки не нужны для имени столбца.

Обновленный ответ 1: Описание ошибки-

-217    Column column-name not found in any table in the query
(or SLV is undefined).

The name appears in the select list or WHERE clause of this query but is
not defined in a table and does not appear as a statement local variable
(SLV) definition. Check that the column name or SLV name and the names of
the selected tables are spelled as you intended.

If all names are spelled correctly, you are not using the right tables,
the database has been changed, or you have not defined the SLV. If the
name not found is a reference to a column, that column might have been
renamed or dropped. If the name not found represents an SLV and you
defined the SLV in the statement, make sure that the SLV definition
appears before all other references to that SLV name.

This error message can also appear during the execution of an ALTER TABLE
statement when the engine tries to update views that depend on the table.

Дополнительная информация ссылка

Обновленный ответ 2:

Если невозможноизменить имя столбца, а затем получить дополнительную информацию о SLV.Вы можете использовать следующие ссылки для описания и использования SLV:

link1 link2 link3

...