Identyfikator ORA-00972 to zbyt długa nazwa kolumny aliasu


81

mam zapytanie typu:

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

zwraca błąd Identyfikator ORA-00972 jest zbyt długi , czy jest jakaś wskazówka, aby działał bez skracania aliasu?

Dzięki

Odpowiedzi:


104

Nie, przed wersją Oracle 12.2 identyfikatory nie mogą przekraczać 30 znaków. Zobacz dokumentację języka Oracle SQL .

Jednak od wersji 12.2 mogą mieć długość do 128 bajtów. (Uwaga: bajty, nie znaki).


23
z ciekawości, czy ktoś wie, skąd się bierze to ograniczenie i dlaczego nigdy nie zostało ono złagodzone? Naprawdę uderza mnie, że żaden z płacących milion dolarów klientów Oracle nigdy nie zażądał takiej funkcji (teraz nie zrozumcie mnie źle, jestem prawie pewien, że jest jakiś głęboki techniczny powód, ale nadal ...)
— phtrivier


Ja też spotkałem się z taką sytuacją. Mam kolumnę tabeli o długości nazwy = 32. Ale dlaczego, u licha, nazwa kolumny tabeli może mieć więcej niż 30 znaków, podczas gdy w tym samym czasie identyfikator nie jest? Te ograniczenia powinny iść w parze, prawda? Jak w ogóle może dojść do takiej sytuacji?
— Vering

@Vering Czy zawiera więcej niż 30 znaków czy więcej niż 30 bajtów? Występuje dziwny błąd, w którym identyfikator może mieć nieco więcej niż 30 bajtów, jeśli ostatni znak jest wielobajtowy.
— Jon Heller

@JonHeller: Jestem pewien, że było to
— 30/32

12

Błąd jest również spowodowany dziwaczną obsługą cudzysłowów i pojedynczych qutoes. Aby uwzględnić w zapytaniu pojedyncze cudzysłowy , użyj podwójnych apostrofów.

To nie zadziała

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

albo to albo

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

ale to działa

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

Znaczniki zmieniłem Przykładowo należy coś równa apostrof pojedynczy cytat Red jeden cytat apostrof
— Cummings mike

5

Obiekt, w którym Oracle przechowuje nazwę identyfikatorów (np. Nazwy tabel użytkownika są przechowywane w tabeli o nazwie USER_TABLES, a nazwy kolumn użytkownika są przechowywane w tabeli o nazwie USER_TAB_COLUMNS), mają kolumny NAME (np. TABLE_NAME w USER_TABLES) o rozmiarze Varchar2 (30) ... i jest jednolity we wszystkich tabelach systemowych obiektów lub identyfikatorów -

 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

Używam systemu raportowania Argos jako frontendu i Oracle z tyłu. Właśnie napotkałem ten błąd i był on spowodowany przez ciąg znaków z podwójnym cudzysłowem na początku i pojedynczym cudzysłowem na końcu. Zastąpienie podwójnego cudzysłowu pojedynczym rozwiązało problem.


0

Jeśli niedawno zaktualizowałeś springboot do 1.4.3, może być konieczne wprowadzenie zmian w pliku yml:

yml w wersji 1.3:

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

yml w wersji 1.4.3:

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

-2

Jak wspominali inni, nazwy w Oracle SQL muszą mieć 30 znaków lub mniej. Dodam, że ta reguła dotyczy nie tylko nazw tabel, ale także nazw pól. Więc masz to.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.