Oracle
 sql >> Baza danych >  >> RDS >> Oracle

ORA-00904:nieprawidłowy identyfikator

Twoim problemem są te zgubne podwójne cytaty.

SQL> CREATE TABLE "APC"."PS_TBL_DEPARTMENT_DETAILS"
  2  (
  3    "Company Code" VARCHAR2(255),
  4    "Company Name" VARCHAR2(255),
  5    "Sector_Code" VARCHAR2(255),
  6    "Sector_Name" VARCHAR2(255),
  7    "Business_Unit_Code" VARCHAR2(255),
  8    "Business_Unit_Name" VARCHAR2(255),
  9    "Department_Code" VARCHAR2(255),
 10    "Department_Name" VARCHAR2(255),
 11    "HR_ORG_ID" VARCHAR2(255),
 12    "HR_ORG_Name" VARCHAR2(255),
 13    "Cost_Center_Number" VARCHAR2(255),
 14    " " VARCHAR2(255)
 15  )
 16  /

Table created.

SQL>

Oracle SQL pozwala nam zignorować wielkość liter w nazwach obiektów bazy danych, pod warunkiem, że utworzymy je z nazwami pisanymi wielkimi literami lub bez użycia podwójnych cudzysłowów. Jeśli użyjemy w skrypcie liter mieszanych lub małych liter i umieścimy identyfikatory w podwójnych cudzysłowach, jesteśmy skazani na używanie podwójnych cudzysłowów i dokładnej wielkości liter za każdym razem, gdy odwołujemy się do obiektu lub jego atrybutów:

SQL> select count(*) from PS_TBL_DEPARTMENT_DETAILS
  2  where Department_Code = 'BAH'
  3  /
where Department_Code = 'BAH'
      *
ERROR at line 2:
ORA-00904: "DEPARTMENT_CODE": invalid identifier


SQL> select count(*) from PS_TBL_DEPARTMENT_DETAILS
  2  where "Department_Code" = 'BAH'
  3  /

  COUNT(*)
----------
         0

SQL>

tl;dr

nie używaj podwójnych cudzysłowów w skryptach DDL

(Wiem, że robi to większość zewnętrznych generatorów kodu, ale są one wystarczająco zdyscyplinowane, aby wszystkie nazwy obiektów umieszczać WIELKIMI LITERAMI).

Odwrotna sytuacja również jest prawdziwa. Jeśli utworzymy tabelę bez użycia cudzysłowów…

create table PS_TBL_DEPARTMENT_DETAILS
( company_code VARCHAR2(255),
  company_name VARCHAR2(255),
  Cost_Center_Number VARCHAR2(255))
;

… możemy odwołać się do niego i jego kolumn w każdym przypadku:

select * from ps_tbl_department_details

… lub

select * from PS_TBL_DEPARTMENT_DETAILS;

… lub

select * from PS_Tbl_Department_Details
where COMAPNY_CODE = 'ORCL'
and cost_center_number = '0980'


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego sqlplus nie łączy się?

  2. Wprowadzenie do zbiorczego zbierania danych PL/SQL w bazie danych Oracle

  3. problem ze znalezieniem listy plików w katalogu

  4. Różne CURRENT_TIMESTAMP i SYSDATE w Oracle

  5. SQL Query do łączenia wartości kolumn z wielu wierszy w Oracle