Неверный идентификатор, хотя столбец находится в таблице
База данных Oracle 11g release2
,
Существует приложение Spring, устанавливающее соединение с вышеуказанной базой данных. Все сопоставления верны. Во время выполнения при отправке формы для обновления записи я получаю исключение invalid identifier : some_column
, Хотя столбец в таблице, когда я делаю desc command
на это через SqlPlus
! Так как это исправить?
2 ответа
Если ваше приложение заключает идентификаторы в двойные кавычки, дело имеет значение.
create table t(id1 int, id2 int);
Table created.
UPDATE T SET ID1 = 1, ID2 = 2;
0 rows updated.
update t set id1 = 1, id2 = 2;
0 rows updated.
UPDATE T SET "ID1" = 1, ID2 = 2;
0 rows updated.
update t set "id1" = 1, id2 = 2;
update t set "id1" = 1, id2 = 2
*
ERROR at line 1:
ORA-00904: "id1": invalid identifier
По умолчанию идентификаторы (имена схем, таблиц, столбцов, процедур и т. Д.) Хранятся в верхнем регистре в каталоге данных. Вы можете написать их так, как хотите, и можете использовать их любым способом в любой части своих запросов, функций и т. Д.; парсер (препроцессор) переписывает их в верхнем регистре.
Однако это не означает, что Oracle не учитывает регистр. Это не. Вы можете потребовать сохранения заглавных букв, заключив идентификатор в двойные кавычки. Вы сделали это; Вы, наверное, думали, что это означает что-то еще.
Если вы определите столбец как id
, ID
, или же Id
Затем вы можете позвонить по любому из трех имен, и вы все равно получите желаемый результат. Тем не менее, если вы вызываете столбец "ID"
, вы должны обратиться к нему как "ID"
не "id"
или же "Id"
Каждый раз, когда вы ссылаетесь на это. (Вы можете, однако, ссылаться на это как id
без двойных кавычек, так как парсер отобразит это в ID
, который так же, как "ID"
.)
Фактически, вы можете иметь два столбца в одной таблице, один из которых называется "ID"
и другие "id"
- нет конфликта. Они могут содержать разные данные - они могут даже иметь разные типы данных. Тем не менее, вы не можете иметь "ID"
а также ID
(или же "ID"
а также id
- потому что Oracle автоматически отображает id
в ID
как я уже сказал).
В вашем случае, простое решение, отбросьте двойные кавычки. Получить привычку НИКОГДА, НИКОГДА не использовать двойные кавычки; это избавит вас от многих проблем.