#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 вы представляете имя объекта с идентификатором, заключенным в кавычки, или идентификатором, не заключенным в кавычки.
- Заключенный в кавычки идентификатор начинается и заканчивается двойными кавычками («). Если вы называете объект схемы, используя идентификатор, заключенный в кавычки, вы должны использовать двойные кавычки всякий раз, когда ссылаетесь на этот объект.
- Идентификатор, не заключенный в кавычки, не окружен никакими знаками препинания.
…
- Идентификаторы без кавычек должны начинаться с буквенного символа из набора символов вашей базы данных. Идентификаторы, заключенные в кавычки, могут начинаться с любого символа.
У вас есть идентификатор, который начинается с числа. Это говорит о том, что решение состоит в том, чтобы использовать идентификатор в кавычках и заключить имя столбца в двойные кавычки:
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. Спасибо, но я не искал обходного пути или практического решения, а скорее хотел понять принцип, по которому мне разрешено создавать переменную, начинающуюся с числа, а затем не разрешать ее выбирать.