Как можно определить, требуется ли имена столбцов помещать в кавычки

TypucT
Дата: 21.02.2022 15:38:37
Всем привет, вопрос по оракл 12

Собственно вопрос:
Как можно определить, требуется ли имена столбцов помещать в кавычки при генерации запросов?

Пример:
3 Views
CREATE OR REPLACE FORCE EDITIONABLE VIEW "VP_TEST_1" (NumberId, Message, "ABC-code") AS 
  SELECT
    1 as NumberId,
    'Text' as Message,
    'A' as "ABC-CODE"
    
    FROM DUAL;
    
  CREATE OR REPLACE FORCE EDITIONABLE VIEW "VP_TEST_2" ("NumberId", "Message", "ABC-code") AS 
  SELECT
    1 as NumberId,
    'Text' as Message,
    'A' as "ABC-CODE"
FROM
    dual;
        
  CREATE OR REPLACE FORCE EDITIONABLE VIEW "VP_TEST_3" ("NUMBERID", "MESSAGE", "ABC-CODE") AS 
  SELECT
    1 as NumberId,
    'Text' as Message,
    'A' as "ABC-CODE"
FROM
    dual;


Для второго представления я обязан использовать кавычки, иначе получу ошибку.
select * from VP_TEST_1 WHERE  NumberId  = 1;
select * from VP_TEST_2 WHERE "NumberId" = 1;
select * from VP_TEST_3 WHERE  NumberId  = 1;


Но такой запрос возвращает одинаковые характеристики всех трех столбцов кроме имени.
SELECT * FROM USER_TAB_COLUMNS WHERE TABLE_NAME like  'VP_TEST_%' AND COLUMN_NAME in ('NumberId','NUMBERID');


P.S.: мне нужно геренировать запросы в приложении. Представления генерируются свободно. И я не могу знать на старте, как они были созданы.
Dimitry Sibiryakov
Дата: 21.02.2022 15:41:42
TypucT
Как можно определить, требуется ли имена столбцов помещать в кавычки при
генерации запросов?

Кавычки требуются если объект был создан с кавычками. То есть его имя либо
регистрочувствительное (содержит символы нижнего регистра в системных вьюхах),
либо содержит запрещённые символы, либо является зарезервированным словом.

PS: Но поскольку речь идёт о генерации запросов, то проще заключать имена в
кавычки всегда если они берутся из вьюх, а не вводятся пользователем.
TypucT
Дата: 21.02.2022 15:43:45
Dimitry Sibiryakov,

замечательно, а как я могу узнать создан ли объект с кавычками?
И еще в моем примере, третье представление было созданно с кавычками, но использование кавычек в запросе не требуется. Селект отрабатывает без ошибок.
SY
Дата: 21.02.2022 15:51:03
Dimitry Sibiryakov

Кавычки требуются если объект был создан с кавычками.


SQL> CREATE TABLE "TBL"("COLUMN1" NUMBER);

Table created.

SQL> INSERT INTO tBl(cOlUmn1) VALUES(1);

1 row created.

SQL>


SY.
Stax
Дата: 21.02.2022 15:52:17
TypucT,

если генерите программно (используя USER_TAB_COLUMNS) то заключайте в двойные кавычки

имена без кавычек приводятся к верхнему регистру

.....
stax
TypucT
Дата: 21.02.2022 15:54:31
Dimitry Sibiryakov

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


Ясно, я так и сделал, проблема во внешних настройках, в которых есть, в том числе, имена столбцов, а регистр для столбцов, которые не содержат запрещенные символы и не были заключены в кавычки, не учитывался. А если я заключаю, что-то в кавычки, нужно учитывать регистр. Минимум, что можно делать, это еще получать список столбцов из USER_TAB_COLUMNS, искать совпадение без учета регистра и использовать имена из таблицы.

Думал, это простое свойство, где-то хранящиеся, но видимо нет. Спасибо, Дмитрий за ответ.
TypucT
Дата: 21.02.2022 15:57:24
SY,

Да это понятно, если использовался только верхний регистр и не было запрещенных символов, то можно использовать просто имя.
Dimitry Sibiryakov
Дата: 21.02.2022 15:58:32

TypucT
проблема во внешних настройках, в которых есть, в том числе, имена столбцов

Их используй как есть. Если надо - настраивающий заключит в кавычки сам.

Posted via ActualForum NNTP Server 1.5

TypucT
Дата: 21.02.2022 16:05:25
Dimitry Sibiryakov,

Тоже выход, настраивали всего год, а не 20 лет, главное чтобы не послали в пешее:)

До кучи проверил:
  CREATE OR REPLACE FORCE EDITIONABLE VIEW "VP_TEST_4" ("NumberId", "NUmberId", "Message", "ABC-code") AS 
  SELECT
    1 as Nummer,
    0 as Nummer,
    'Text' as Message,
    'A' as "ABC-CODE"
FROM
    dual;
        
  CREATE OR REPLACE FORCE EDITIONABLE VIEW "VP_TEST_5" ("NUMBERID", "NUMBERID", "MESSAGE", "ABC-CODE") AS 
  SELECT
    1 as Nummer,
    0 as Nummer,
    'Text' as Message,
    'A' as "ABC-CODE"
FROM
    dual;


Четвертую вьюху сгенерировать можно, а пятую нет.
Соответственно, проверка настроек без учета регистра, так себе идея.
Dimitry Sibiryakov
Дата: 21.02.2022 16:07:32

Никто вменяемый регистрочувствительные имена в базе не делает. Извращенцы должны
страдать.

Posted via ActualForum NNTP Server 1.5