Заключение имен столбцов в двойные кавычки с помощью команды CREATE в Oracle работает неправильно. Зачем? - PullRequest
13 голосов
/ 25 декабря 2011

Давайте рассмотрим простую таблицу, скажем, products в Oracle (я пробовал на Oracle 9i).Я создаю эту таблицу с помощью следующего оператора CREATE.

CREATE TABLE products

("prod_id" varchar2(7) primary key, "product_name" varchar2(30) NOT NULL);

Следует особо отметить, что я заключаю имена столбцов в двойные кавычки "", как это обычно не делается.Очевидно, что это сработало бы, и таблица products была бы создана с этими двумя столбцами с указанными КОНСТРАИНТАМИ.


Теперь давайте вставим несколько строк в эту таблицу, используя следующую команду INSERT INTO.

INSERT INTO products VALUES('P0001', 'Nokia-N97');
INSERT INTO products VALUES('P0002', 'Nokia-1208');
INSERT INTO products VALUES('P0003', 'Nokia-1115');

Вставит три строки в таблицу products.


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

SELECT * FROM products;

будет работать нормально и отобразит три вставленные строки.


Теперь актуальный вопрос здесь.Когда мы выполняем следующую инструкцию SELECT,

SELECT prod_id, product_name FROM products;

не будет работать, даже если мы не допустили ошибок в этом SQL.Вместо этого Oracle сообщит, что таких столбцов не существует.Почему это происходит?Я думаю, что для этого должна быть очень конкретная причина.

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

1 Ответ

21 голосов
/ 25 декабря 2011

Вопреки распространенному мнению, Oracle учитывает регистр в именах столбцов и таблиц. По умолчанию он просто конвертирует все в верхний регистр.

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

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

Так что это должно работать:

SELECT "prod_id", "product_name" FROM products;

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

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