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

ORA-00904:ugyldig identifikator

Dit problem er de skadelige dobbelte anførselstegn.

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 giver os mulighed for at ignorere tilfælde af databaseobjektnavne, forudsat at vi enten opretter dem med navne med store bogstaver eller uden at bruge dobbelte anførselstegn. Hvis vi bruger blandede bogstaver eller små bogstaver i scriptet og indpakket identifikatorerne i dobbelte anførselstegn, er vi dømt til at bruge dobbelte anførselstegn og præcise bogstaver, når vi henviser til objektet eller dets attributter:

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

brug ikke dobbelte anførselstegn i DDL-scripts

(Jeg ved, at de fleste tredjeparts kodegeneratorer gør det, men de er disciplinerede nok til at sætte alle deres objektnavne med STORE BOGSTAVER.)

Det omvendte er også sandt. Hvis vi opretter tabellen uden at bruge dobbelte anførselstegn …

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

… vi kan referere til den og dens spalter, uanset hvad det passer os:

select * from ps_tbl_department_details

… eller

select * from PS_TBL_DEPARTMENT_DETAILS;

… eller

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


  1. Forstå forskellene mellem tabel- og transaktions-API'er

  2. Find værdier, der ikke indeholder tal, i SQLite

  3. forskel mellem primær nøgle og unik nøgle

  4. Bedste praksis:.NET:Hvordan returnerer jeg PK mod en oracle-database?