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.