Oracle
 sql >> Database >  >> RDS >> Oracle

ORA-00904:identificatore non valido

Il tuo problema sono quelle perniciose virgolette.

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 ci consente di ignorare il caso dei nomi degli oggetti del database a condizione che li creiamo con i nomi tutti in maiuscolo o senza utilizzare virgolette doppie. Se utilizziamo maiuscole miste o minuscole nello script e racchiudiamo gli identificatori tra virgolette doppie siamo condannati a usare le virgolette doppie e il caso preciso ogni volta che ci riferiamo all'oggetto o ai suoi attributi:

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

non usare le virgolette negli script DDL

(So ​​che la maggior parte dei generatori di codice di terze parti lo fa, ma sono abbastanza disciplinati da mettere tutti i nomi degli oggetti in MAIUSCOLO.)

È vero anche il contrario. Se creiamo la tabella senza usare le doppie virgolette…

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

... possiamo fare riferimento ad esso e alle sue colonne in ogni caso ci piace:

select * from ps_tbl_department_details

… o

select * from PS_TBL_DEPARTMENT_DETAILS;

… o

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