válido sqlsyntaxerrorexception solucion ora oci_execute object_id invalid identificador error sql database oracle ora-00904

sqlsyntaxerrorexception - ORA-00904: identificador no válido



ora-00904 solucion (9)

¿Seguro que tienes una columna DEPARTEMENT_CODE en tu mesa PS_TBL_DEPARTMENT_DETAILS?

Más información sobre tu ERROR

ORA-00904: cadena: identificador no válido Causa: el nombre de columna ingresado es inexistente o no es válido. Acción: ingrese un nombre de columna válido. Un nombre de columna válido debe comenzar con una letra, ser menor o igual a 30 caracteres y estar formado únicamente por caracteres alfanuméricos y los caracteres especiales $, _ y #. Si contiene otros caracteres, debe estar entre comillas dobles. Puede que no sea una palabra reservada.

Traté de escribir la siguiente consulta de combinación interna usando una base de datos 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

Eso da el siguiente error:

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

El DDL de una tabla es:

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


Asegúrese de que no haya / después de sus declaraciones DDL.


DEPARTMENT_CODE no es una columna que existe en la tabla Equipo. Verifique el DDL de la tabla para encontrar el nombre de columna correcto.


En mi caso, este error ocurrió debido a la falta de existencia del nombre de la columna en la tabla.

Cuando ejecuté " describe tablename ", no pude encontrar la columna especificada en el archivo hbm de mapeo.

Después de alterar la tabla, funcionó bien.


Estaba pasando los valores sin las comillas. Una vez que pasé las condiciones dentro de las comillas simples funcionó como un amuleto.

Select * from emp_table where emp_id=123;

en lugar de lo anterior, usa esto:

Select * from emp_table where emp_id=''123'';


FYI, en este caso, se encontró que la causa era un nombre de columna de caso mixto en el DDL para la creación de la tabla.

Sin embargo, si mezcla "estilo antiguo" y ANSI se une, puede obtener el mismo mensaje de error incluso cuando el DDL se realizó correctamente con el nombre de la tabla en mayúscula. Esto me pasó a mí, y google me envió a esta página de así que pensé en compartirla desde que estuve aquí.

--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 /

Las dos declaraciones SQL anteriores son equivalentes y no producen ningún error.

Cuando intenta mezclarlos puede tener suerte, o puede obtener un Oracle que tiene un error ORA-00904.

--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 /

Y el mensaje de error inútil que realmente no describe el problema en absoluto:

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

Pude encontrar algo de investigación sobre esto en la siguiente publicación de blog:

En mi caso, estaba intentando convertir manualmente estilo antiguo a combinaciones de estilo ANSI, y lo hacía de forma incremental, una tabla a la vez. Esto parece haber sido una mala idea. En su lugar, probablemente sea mejor convertir todas las tablas a la vez, o comentar una tabla y sus condiciones en la consulta original para comparar con la nueva consulta ANSI que está escribiendo.


También asegúrese de que al usuario que emite la consulta se le hayan otorgado los permisos necesarios.

Para consultas en tablas, debe otorgar el permiso SELECT.
Para consultas sobre otros tipos de objetos (por ejemplo, procedimientos almacenados) debe otorgar el permiso EXECUTE.


Tu problema son esas comillas dobles 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>

Oracle SQL nos permite ignorar el caso de los nombres de los objetos de la base de datos siempre que los creemos con nombres en mayúsculas o sin utilizar comillas dobles. Si usamos mayúsculas y minúsculas en el guión y envolvemos los identificadores entre comillas dobles, estamos condenados a usar comillas dobles y al caso preciso siempre que nos refiramos al objeto o a sus 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

no use comillas dobles en scripts DDL

(Sé que la mayoría de los generadores de código de terceros sí, pero son lo suficientemente disciplinados como para poner todos sus nombres de objeto en MAYÚSCULAS).


Tuve la misma excepción en JPA 2 usando el enlace eclipse. Tenía una clase @embedded con una relación uno a uno con una entidad. Por error, en la clase incrustada, también tuve la anotación @Table ("TRADER"). Cuando el DB fue creado por el JPA a partir de las entidades, también creó una tabla TRADER (que era incorrecta ya que la entidad Trader estaba incrustada en la entidad principal) y la existencia de esa tabla causaba la excepción anterior cada vez que intentaba persiste mi entidad. Después de eliminar la tabla TRADER, la excepción desapareció.