Oracle
 sql >> Base de données >  >> RDS >> Oracle

ORA-00904 :identifiant invalide

Votre problème, ce sont ces doubles guillemets pernicieux.

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 nous permet d'ignorer la casse des noms d'objets de base de données à condition de les créer avec des noms tous en majuscules ou sans utiliser de guillemets doubles. Si nous utilisons des majuscules ou des minuscules dans le script et enveloppons les identifiants entre guillemets doubles nous sommes condamnés à utiliser des guillemets doubles et la casse précise chaque fois que nous nous référons à l'objet ou à ses attributs :

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

n'utilisez pas de guillemets doubles dans les scripts DDL

(Je sais que la plupart des générateurs de code tiers le font, mais ils sont suffisamment disciplinés pour mettre tous leurs noms d'objets en MAJUSCULES.)

L'inverse est également vrai. Si nous créons le tableau sans utiliser de guillemets doubles …

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

… nous pouvons le référencer ainsi que ses colonnes dans tous les cas qui nous plaisent :

select * from ps_tbl_department_details

… ou

select * from PS_TBL_DEPARTMENT_DETAILS;

… ou

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