Pergunta

Eu tentei escrever a seguinte consulta de associação interna utilizando um banco de dados Oracle:

 SELECT Employee.EMPLID as EmpID, 
        Employee.FIRST_NAME AS Name,
        Team.DEPARTMENT_CODE AS TeamID, 
        Team.Department_Name AS teamname
 FROM PS_TBL_EMPLOYEE_DETAILS Employee
 INNER JOIN PS_TBL_DEPARTMENT_DETAILS Team 
 ON Team.DEPARTMENT_CODE = Employee.DEPTID

Que dá a abaixo de erro:

 INNER JOIN PS_TBL_DEPARTMENT_DETAILS Team ON Team.DEPARTMENT_CODE = Employee.DEPTID
                                              *
ERROR at line 4:
ORA-00904: "TEAM"."DEPARTMENT_CODE": invalid identifier

A DDL de uma tabela é:

CREATE TABLE "HRMS"."PS_TBL_DEPARTMENT_DETAILS"
(
  "Company Code" VARCHAR2(255),
  "Company Name" VARCHAR2(255),
  "Sector_Code" VARCHAR2(255),
  "Sector_Name" VARCHAR2(255),
  "Business_Unit_Code" VARCHAR2(255),
  "Business_Unit_Name" VARCHAR2(255),
  "Department_Code" VARCHAR2(255),
  "Department_Name" VARCHAR2(255),
  "HR_ORG_ID" VARCHAR2(255),
  "HR_ORG_Name" VARCHAR2(255),
  "Cost_Center_Number" VARCHAR2(255),
  " " VARCHAR2(255)
)
SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS
Foi útil?

Solução

O problema é que esses perniciosa aspas duplas.

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 nos permite ignorar o caso de nomes de objeto de banco de dados fornecidos pode-se criá-los com todos os nomes em maiúsculas, ou sem o uso de aspas duplas.Se usar maiúsculas ou minúsculas no script e envolveu os identificadores entre aspas duplas estamos condenados a utilizar aspas e o caso específico sempre que se referir ao objeto ou dos 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 em scripts DDL

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


O inverso também é verdadeiro.Se vamos criar a tabela sem o uso de aspas duplas ...

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

... a gente pode fazer referência a ele e suas colunas, em qualquer caso, nossa fantasia:

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'

Outras dicas

No meu caso, este erro ocorreu, devido à falta de existência de um nome de coluna na tabela.

Quando eu executado "describe tablename", eu não era capaz de encontrar a coluna especificada no mapeamento de arquivo hbm.

Depois de alterar a tabela, ele funcionou bem.

DEPARTMENT_CODE não é uma coluna que existe na tabela de Equipe.Verifique a DDL da tabela para encontrar o bom nome da coluna.

FYI, neste caso, a causa foi encontrado para ser misturado caso o nome da coluna na DDL para criação da tabela.

No entanto, se você está misturando o "velho estilo" e ANSI você pode obter a mesma mensagem de erro, mesmo quando o DDL foi feito corretamente com letras maiúsculas nome da tabela.Isso aconteceu comigo, e o google me enviou a este stackoverflow página, então eu pensei que eu iria partilhar desde que eu estive aqui.

--NO PROBLEM: ANSI syntax
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM PS_PERSON A
INNER JOIN PS_NAME_PWD_VW B ON B.EMPLID = A.EMPLID
INNER JOIN PS_HCR_PERSON_NM_I C ON C.EMPLID = A.EMPLID
WHERE 
    LENGTH(A.EMPLID) = 9
    AND LENGTH(B.LAST_NAME) > 5
    AND LENGTH(C.LAST_NAME) > 5
ORDER BY 1, 2, 3
/

--NO PROBLEM: OLD STYLE/deprecated/traditional oracle proprietary join syntax
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM PS_PERSON A
, PS_NAME_PWD_VW B 
, PS_HCR_PERSON_NM_I C 
WHERE 
    B.EMPLID = A.EMPLID
    and C.EMPLID = A.EMPLID
    and LENGTH(A.EMPLID) = 9
    AND LENGTH(B.LAST_NAME) > 5
    AND LENGTH(C.LAST_NAME) > 5
ORDER BY 1, 2, 3
/

As duas instruções SQL acima são equivalentes e não produzir nenhum erro.

Quando você tenta misturá-los de que você pode ter sorte, ou você pode obter um Oracle tem um ORA-00904 erro.

--LUCKY: mixed syntax (ANSI joins appear before OLD STYLE)
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM 
    PS_PERSON A
    inner join PS_HCR_PERSON_NM_I C on C.EMPLID = A.EMPLID
    , PS_NAME_PWD_VW B
WHERE 
    B.EMPLID = A.EMPLID
    and LENGTH(A.EMPLID) = 9
    AND LENGTH(B.FIRST_NAME) > 5
    AND LENGTH(C.LAST_NAME) > 5
/

--PROBLEM: mixed syntax (OLD STYLE joins appear before ANSI)
--http://sqlfascination.com/2013/08/17/oracle-ansi-vs-old-style-joins/
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM 
    PS_PERSON A
    , PS_NAME_PWD_VW B
    inner join PS_HCR_PERSON_NM_I C on C.EMPLID = A.EMPLID
WHERE 
    B.EMPLID = A.EMPLID
    and LENGTH(A.EMPLID) = 9
    AND LENGTH(B.FIRST_NAME) > 5
    AND LENGTH(C.LAST_NAME) > 5
/

E o inútil mensagem de erro que realmente não descrever o problema:

>[Error] Script lines: 1-12 -------------------------
ORA-00904: "A"."EMPLID": invalid identifier  Script line 6, statement line 6,
column 51 

Eu era capaz de encontrar alguma pesquisa sobre isso no seguinte blog:

No meu caso, eu estava tentando converter manualmente a partir de estilo antigo para associações de estilo ANSI, e estava fazendo isso de forma incremental, uma tabela de cada vez.Esta parece ter sido uma má idéia.Em vez disso, é provavelmente melhor para converter todas as tabelas de uma vez, ou comentar uma tabela e suas condições where na consulta original para comparar com a nova consulta ANSI você está escrevendo.

Tem certeza de que você tem uma coluna DEPARTEMENT_CODE na sua mesa PS_TBL_DEPARTMENT_DETAILS

Mais informações sobre o ERRO

ORA-00904:seqüência de caracteres:identificador inválido Causa:O nome da coluna inserida está faltando ou é inválido.Ação:Insere o nome da coluna.Uma coluna válida nome deve começar com uma letra ser menor ou igual a 30 caracteres, e conter apenas caracteres alfanuméricos e os caracteres especiais $, _, e #.Se ele contém outros personagens, então ele deve ser incluído em d duplo as aspas.Ele não pode ser uma palavra reservada.

Eu tinha a mesma exceção em JPA 2 usando o eclipse link.Eu tinha um @incorporada de classe com um para um relacionamento com uma entidade.Por engano ,na classe incorporada, eu também tinha a anotação @Table("COMERCIANTE").Quando o DB foi criado pela APP de entidades também criou uma tabela COMERCIANTE (que era errado, como o Comerciante entidade foi incorporada à principal entidade) e a existência de tabela de que estava causando o acima exceção cada vez que eu estava tentando manter minha entidade.Depois de eliminar o COMERCIANTE tabela a exceção disappered.

Também certifique-se de que o usuário de emitir a consulta tenha sido concedido as permissões necessárias.

Para consultas em tabelas, você precisa conceder permissão de SELECT.
Para consultas em outros tipos de objeto (por exemplo,procedimentos armazenados), você precisa conceder permissão de EXECUÇÃO.

Eu estava passando os valores sem as aspas.Depois que eu passei a condições dentro de aspas simples trabalhou como um encanto.

Select * from emp_table where emp_id=123;

em vez de acima, use este:

Select * from emp_table where emp_id='123';

Eu tive esse erro ao tentar salvar uma entidade JPA.

Era porque eu tinha uma coluna com @JoinColumn anotação de que não tem @ManyToOne anotação.

Adicionar @ManyToOne corrigido o problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top