Неверный столбец ORA- 00904 ошибка при вставке в таблицу из вида - PullRequest
0 голосов
/ 03 июля 2019

В моей основной таблице есть столбец структуры таблицы без двойных кавычек, но в столбце просмотра с двойными кавычками. При вставке данных из представления в таблицу возникает ошибка. Вот структура таблицы tbl

create table tbl (ID number(10),
                  name varchar2(50),
                  addr varchar2(200));

Пока просмотр -

 create or replace view t_view as
 select "ID", "name", "addr"  from tbl;

При вставке данных в tbl из t_view -

insert into tbl
select * from t_view;

Тогда получаю ошибку ORA- 00904: "addr": Invalid identifier.

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

Ответы [ 3 ]

3 голосов
/ 03 июля 2019

Удалите все двойные кавычки из любого места в вашем коде.

Если вы используете их при создании объектов, вам придется использовать их всегда , указав точно такой же регистр букв.

Избавьтесь от них, Oracle по умолчанию нечувствителен к регистру и обрабатывает все имена как прописные (но вы можете ссылаться на них так, как хотите, только не используйте двойные кавычки!).

0 голосов
/ 04 июля 2019

Чего вы пытаетесь достичь? Ваш запрос просто не имеет смысла. Ваше предполагаемое заявление

insert into tbl select * from t_view;

выполняет то же самое, что и

insert into tbl select * from tbl;

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

0 голосов
/ 03 июля 2019

Oracle сохраняет имя любого объекта в UPPERCASE по умолчанию.Если вы указали двойные кавычки, тогда только Oracle хранит имя объекта как есть.

  • Двойные кавычки - чувствительны к регистру
  • Без кавычек - нечувствительны к регистру - сохраняет имя в UPPERCASE

В вашем случае, при написании DDL таблицы, вы не указали имя столбца в двойных кавычках, поэтому имя вашей таблицы и имена столбцов хранятся в UPPERCASE в метаданных.

Вы можете увидеть то же самое, используя следующий запрос

select table_name, column_name from user_tab_columns where table_name = 'TBL';

Для предоставления своего ответа создайте представление любого из следующих синтаксисов:

create or replace view t_view as
 select ID, name, addr  from tbl; -- no double quotes

create or replace view t_view as
 select "ID", "NAME", "ADDR"  from tbl; -- UPPERCASE column names in double quotes

См. Демонстрационную версию здесь

ура !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...