Ідентифікатор ORA-00972 - занадто довга назва псевдоніма


81

у мене такий запит, як:

SELECT column as averyveryveryverylongalias (more than 30 characters)
   FROM Table_name

він повертає помилку ORA-00972 ідентифікатор занадто довгий , чи є підказка, щоб змусити його працювати, не скорочуючи псевдонім?

Дякую

Відповіді:


104

Ні, до версії Oracle 12.2 ідентифікатори не повинні перевищувати 30 символів. Див . Oracle SQL Language Reference .

Однак з версії 12.2 вони можуть мати довжину до 128 байт. (Примітка: байти, а не символи).


23
з цікавості хтось знає, звідки це обмеження, і як так, що межа ніколи не була послаблена? Мені справді вражає, що жоден з мільйонів доларів, що платять клієнтами Oracle, ніколи не просив про таку функцію (тепер, не зрозумійте мене неправильно, я майже впевнений, що є якісь глибокі технічні причини, але все ж ..)
phtrivier

10
Добре, я міг би попросити SO: stackoverflow.com/questions/1378133 / ...
phtrivier

Я теж стикався з цією ситуацією. У мене є стовпець таблиці з довжиною імені = 32. Але чому, по суті, ім'я стовпця таблиці має мати більше 30 символів, тоді як ідентифікатор одночасно не є? Ці межі повинні йти рука об руку, так? Як взагалі може виникнути така ситуація?
Верінг

@Vering Це більше 30 символів чи більше 30 байт? Існує дивна помилка, коли ідентифікатор може бути трохи більше 30 байт, якщо останній символ є багатобайтовим.
Джон Хеллер,

@JonHeller: Я цілком впевнений, що це було 30/32 символів
Vering

12

Помилка також спричинена химерною обробкою котирувань та одиничних куто. Щоб включити одинарні лапки всередину запиту, використовуйте подвоєні одинарні лапки.

Це не спрацює

select dbms_xmlgen.getxml("Select ....") XML from dual;

або це або

select dbms_xmlgen.getxml('Select .. where something='red'..') XML from dual;

але це ДІЄ

select dbms_xmlgen.getxml('Select .. where something=''red''..') XML from dual;

Розмітка змінила мій приклад, це має бути щось, що дорівнює одній цитаті одній цитаті червоній одній цитаті одній цитаті
Майк Каммінгс

5

Об'єкт, де Oracle зберігає ім'я ідентифікаторів (наприклад, імена таблиць користувача зберігаються в таблиці з іменем USER_TABLES, а імена стовпців користувача зберігаються в таблиці з іменем USER_TAB_COLUMNS), має стовпці NAME (наприклад, TABLE_NAME в USER_TABLES) розміру Varchar2 (30) ... і він уніфікований у всіх системних таблицях об’єктів або ідентифікаторів -

 DBA_ALL_TABLES         ALL_ALL_TABLES        USER_ALL_TABLES
 DBA_PARTIAL_DROP_TABS  ALL_PARTIAL_DROP_TABS USER_PARTIAL_DROP_TABS
 DBA_PART_TABLES        ALL_PART_TABLES       USER_PART_TABLES 
 DBA_TABLES             ALL_TABLES            USER_TABLES           
 DBA_TABLESPACES        USER_TABLESPACES      TAB
 DBA_TAB_COLUMNS      ALL_TAB_COLUMNS         USER_TAB_COLUMNS 
 DBA_TAB_COLS         ALL_TAB_COLS            USER_TAB_COLS 
 DBA_TAB_COMMENTS     ALL_TAB_COMMENTS        USER_TAB_COMMENTS 
 DBA_TAB_HISTOGRAMS   ALL_TAB_HISTOGRAMS      USER_TAB_HISTOGRAMS 
 DBA_TAB_MODIFICATIONS  ALL_TAB_MODIFICATIONS USER_TAB_MODIFICATIONS 
 DBA_TAB_PARTITIONS   ALL_TAB_PARTITIONS      USER_TAB_PARTITIONS

5

Я використовую систему звітності Argos як інтерфейс, а Oracle - ззаду. Я щойно зіткнувся з цією помилкою, і вона була спричинена рядком із подвійною лапкою на початку та одинарною лапкою в кінці. Заміна подвійної лапки на одну вирішила проблему.


0

Якщо ви нещодавно оновили Springboot до 1.4.3, можливо, вам доведеться внести зміни до файлу yml:

yml в 1.3:

jpa: 
  hibernate: 
    namingStrategy: org.hibernate.cfg.EJB3NamingStrategy

yml в 1.4.3:

jpa: 
  hibernate: 
    naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

-2

Як згадували інші, імена в Oracle SQL повинні мати менше або дорівнювати 30 символам. Я хотів би додати, що це правило застосовується не тільки до назв таблиць, але і до назв полів. Отже, у вас це є.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.