Oracle
 sql >> Datenbank >  >> RDS >> Oracle

ORA-00904:Ungültige Kennung

Ihr Problem sind diese schädlichen doppelten Anführungszeichen.

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 erlaubt es uns, die Groß-/Kleinschreibung von Datenbankobjektnamen zu ignorieren, vorausgesetzt, wir erstellen sie entweder mit Namen, die alle in Großbuchstaben geschrieben sind, oder ohne doppelte Anführungszeichen. Wenn wir im Skript gemischte Groß- oder Kleinschreibung verwenden und die Bezeichner in doppelte Anführungszeichen setzen, sind wir dazu verdammt, doppelte Anführungszeichen und die genaue Groß-/Kleinschreibung zu verwenden, wenn wir uns auf das Objekt oder seine Attribute beziehen:

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

Verwenden Sie keine doppelten Anführungszeichen in DDL-Skripten

(Ich weiß, dass die meisten Codegeneratoren von Drittanbietern das tun, aber sie sind diszipliniert genug, alle ihre Objektnamen in GROSSBUCHSTABEN zu schreiben.)

Das Gegenteil ist auch wahr. Wenn wir die Tabelle ohne doppelte Anführungszeichen erstellen …

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

… wir können ihn und seine Spalten nach Belieben referenzieren:

select * from ps_tbl_department_details

… oder

select * from PS_TBL_DEPARTMENT_DETAILS;

… oder

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