Oracle SQL, имя столбца выдает ORA-00911: недопустимый символ

#sql #oracle #invalid-characters #quoted-identifier #ora-00911

#sql #Oracle #недопустимые символы #идентификатор в кавычках #ora-00911

Вопрос:

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

 create table MYTAB as
select *
from (select x, anno, v, delta from tab_a13_2 where anno in(2017,2018,2019))
pivot(sum(v)  as v, sum(delta) as d for anno in (2017,2018,2019)) 
where ordine > 0
order by ordine;

select * from MYTAB;
x 2017_V    2017_D  2018_V  2018_D  2019_V  2019_D
1   1.01    -3.18     1.04   11.18    0.96   -6.87
2   1.28     0.09     1.28    7.33    1.25   -1.49
...
 

Однако, если я попытаюсь указать имена столбцов в select, я получу эту ошибку:

 select x,
       2017_V, 2018_V, 2019_V,
       2017_D, 2018_D, 2019_D 
from MYTAB;

Error at line 5:
ORA-00911: invalid character
           2017_V, 2018_V, 2019_V,
               ^
1 statement failed.
 

Я этого не понимаю. Либо мне не разрешено создавать имена столбцов, начинающиеся с числа, и поэтому создание таблицы должно завершиться неудачей, либо я должен иметь возможность их использовать.
Я проверил, что имена столбцов не заключены в кавычки, т.Е. «2017_V».

Комментарии:

1. Используйте двойные кавычки. Базы данных привередливы в отношении идентификаторов, которые начинаются с чисел — или, что еще лучше, исправьте имена, чтобы их не нужно было экранировать.

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

3. Когда PIVOT генерирует имена столбцов, он заключает их в двойные кавычки. Вы можете увидеть сгенерированный SQL с помощью dbms_utility.expand_sql_text .

Ответ №1:

Из документации по именам объектов базы данных и квалификаторам:

Правила именования объектов базы данных

У каждого объекта базы данных есть имя. В инструкции SQL вы представляете имя объекта с идентификатором, заключенным в кавычки, или идентификатором, не заключенным в кавычки.

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

  1. Идентификаторы без кавычек должны начинаться с буквенного символа из набора символов вашей базы данных. Идентификаторы, заключенные в кавычки, могут начинаться с любого символа.

У вас есть идентификатор, который начинается с числа. Это говорит о том, что решение состоит в том, чтобы использовать идентификатор в кавычках и заключить имя столбца в двойные кавычки:

 select x,
       "2017_V",
       "2018_V",
       "2019_V",
       "2017_D",
       "2018_D",
       "2019_D" 
from   MYTAB;
 

Ответ №2:

Один из вариантов заключается в том, что при создании таблицы не создавайте столбцы, начинающиеся с чисел. При выполнении PIVOT вы можете псевдонимировать значения в предложении IN, чтобы ваши столбцы, созданные из pivot, были более удобными для пользователя. Попробуйте создать свою таблицу, используя оператор, подобный этому:

   SELECT *
    FROM (SELECT x,
                 anno,
                 v,
                 delta
            FROM tab_a13_2
           WHERE anno IN (2017, 2018, 2019))
         PIVOT (SUM (v) AS v, SUM (delta) AS d
               FOR anno
               IN (2017 AS year_2017, 2018 AS year_2018, 2019 AS year_2019))
   WHERE ordine > 0
ORDER BY ordine;
 

Комментарии:

1. Спасибо, но я не искал обходного пути или практического решения, а скорее хотел понять принцип, по которому мне разрешено создавать переменную, начинающуюся с числа, а затем не разрешать ее выбирать.