Включение имен столбцов в двойных метках квотации с помощью команды CREATE в Oracle не работает должным образом. Зачем?

Давайте рассмотрим простую таблицу: 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

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

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

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

Итак, это должно работать:

SELECT "prod_id", "product_name" FROM products;

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