Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

ORA-00904:identificador inválido


Seu problema são essas aspas duplas perniciosas.
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>

O Oracle SQL nos permite ignorar o caso de nomes de objetos de banco de dados, desde que os criemos com nomes todos em letras maiúsculas ou sem usar aspas duplas. Se usarmos letras maiúsculas ou minúsculas no script e colocarmos os identificadores entre aspas duplas, estamos condenados a usar aspas duplas e o caso preciso sempre que nos referirmos ao objeto ou seus atributos:
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ão use aspas duplas em scripts DDL

(Eu sei que a maioria dos geradores de código de terceiros o fazem, mas eles são disciplinados o suficiente para colocar todos os nomes de seus objetos em MAIÚSCULAS.)

O contrário também é verdade. Se criarmos a tabela sem usar aspas duplas…
create table PS_TBL_DEPARTMENT_DETAILS
( company_code VARCHAR2(255),
  company_name VARCHAR2(255),
  Cost_Center_Number VARCHAR2(255))
;

… podemos fazer referência a ele e suas colunas em qualquer caso que desejarmos:
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'