sql >> Database >  >> RDS >> Oracle

ORA-00904:ongeldige identificatie

Jouw probleem zijn die verderfelijke dubbele aanhalingstekens.

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 stelt ons in staat om namen van databaseobjecten te negeren, op voorwaarde dat we ze ofwel maken met namen allemaal in hoofdletters, of zonder dubbele aanhalingstekens te gebruiken. Als we hoofdletters of kleine letters in het script gebruiken en de identifiers tussen dubbele aanhalingstekens plaatsen, zijn we veroordeeld tot het gebruik van dubbele aanhalingstekens en het precieze geval wanneer we naar het object of zijn attributen verwijzen:

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

gebruik geen dubbele aanhalingstekens in DDL-scripts

(Ik weet dat de meeste codegeneratoren van derden dat doen, maar ze zijn gedisciplineerd genoeg om al hun objectnamen in HOOFDLETTERS te zetten.)

Het omgekeerde is ook waar. Als we de tabel maken zonder dubbele aanhalingstekens te gebruiken ...

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

... we kunnen ernaar verwijzen en de kolommen ervan in elk geval dat we willen:

select * from ps_tbl_department_details

… of

select * from PS_TBL_DEPARTMENT_DETAILS;

… of

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


  1. Het failovermechanisme van MaxScale gebruiken?

  2. php / Mysql beste boomstructuur

  3. Knee-Jerk Performance Tuning:voeg gewoon een SSD toe

  4. Retourrijen die numerieke waarden bevatten in Oracle