Синтаксис Oracle SQL: цитируемый идентификатор - PullRequest
3 голосов
/ 24 июня 2011

Я столкнулся с SQL-запросами, которые выглядели как

select "hello"
from "foo"."bar"

Я обнаружил, что мы можем заключать в кавычки и без кавычек идентификаторы в Oracle: Имена и квалификаторы объектов базы данных

... Идентификатор в кавычках начинается и заканчивается двойными кавычками ("). Если вы называете объект схемы с помощью идентификатора в кавычках, то вы должны использовать двойные кавычки всякий раз, когда ссылаетесь на этот объект ...

Я спросил администраторов баз данных, и мне сказали, что есть таблица с именем bar , но не "bar"

Почему это?

Ответы [ 4 ]

7 голосов
/ 24 июня 2011

Таблица называется bar, а не BAR или "bar", но поскольку она строчная, вы можете только ссылаться на , используя двойные кавычки:

select * from bar; -- will fail

select * from "bar"; -- will succeed

Мораль такова: никогда создавайте такие таблицы!

3 голосов
/ 24 июня 2011

Полезно знать, что в data_dictionary имена объектов хранятся с заглавной буквы;если вы не используете указанный в кавычках идентификатор, чтобы специально сказать оракулу «эй, мы не хотим, чтобы это имя объекта чувствительно к регистру» или другими словами, «создайте эту таблицу с этим буквальным именем»

Ниже - создайте таблицуименованный бар, вы можете выбрать, используя «из бара», «из бара», «из бара».'from "bar" не будет работать, потому что вы говорите оракулу "дайте мне результаты из таблицы, буквально называемой строчными" bar ".

создайте таблицу с именем" bar ", которую вы можете выбрать только изон использует «from» bar ». Это потому, что« from bar »переводится как« из BAR ».

SQL> create table bar (x varchar2(1));

Table created.

SQL> 
SQL> select * from bar;

no rows selected

SQL> select * from BAR;

no rows selected

SQL> select * from "bar";
select * from "bar"
              *
ERROR at line 1:
ORA-00942: table or view does not exist 


SQL> select * from "BAR";

no rows selected

SQL> 
SQL> drop table bar;

Table dropped.

SQL> 
SQL> create table "bar" (x varchar2(1));

Table created.

SQL> 
SQL> select * from bar;
select * from bar
              *
ERROR at line 1:
ORA-00942: table or view does not exist 


SQL> select * from BAR;
select * from BAR
              *
ERROR at line 1:
ORA-00942: table or view does not exist 


SQL> select * from "bar";

no rows selected

SQL> select * from "BAR";
select * from "BAR"
              *
ERROR at line 1:
ORA-00942: table or view does not exist 


SQL> 
SQL> drop table "bar";

Table dropped.

SQL> spool off
2 голосов
/ 24 июня 2011

На другом, но похожем примечании, двойные кавычки в Oracle указывают идентификатор, а не строковую константу, как указывает текст, который вы цитировали.Это означает, что ваш пример выдаст вам ошибку, даже если "foo". "Bar" существует.Рассмотрим простой пример:

SQL> SELECT "hello" FROM "DUAL";

SELECT "hello" FROM "DUAL"

ORA-00904: "hello": invalid identifier

против этого:

SQL> SELECT 'hello' FROM "DUAL";

'HELLO'
-------
hello

«ДВОЙНОЙ» - это идентификатор: в этом случае он представляет таблицу.Он может представлять пользователя, столбец и т. Д., Но не будет интерпретироваться как строковая константа.

2 голосов
/ 24 июня 2011

Заключая в кавычки что-то, оно вызывает сопоставление без сопоставления для объекта базы данных.Поэтому я думаю, что ответ Тони почти верен:

select sysdate from dual; -- works

select sysdate from DUAL; -- works

select sysdate from "DUAL"; -- works

select sysdate from "dual"; - FAILS

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

Я не экспериментировал с Oracle, но в других СУБД использование заключенных в кавычки идентификаторов позволяет вам использовать зарезервированные слова в качестве идентификаторов, например, в MySQL (которая использует обратную кавычку, а не уши кролика), допустимо следующее:

SELECT `SUM` FROM `WHERE`;

HTH

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