Hacemos una revisión profunda cada uno de los posts en nuestra página web con el objetivo de enseñarte siempre información más veraz y actualizada.
Solución:
Su 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 las mayúsculas y minúsculas de los nombres de los objetos de la base de datos siempre que los creemos con nombres en mayúsculas o sin usar comillas dobles. si usamos mixed mayúsculas o minúsculas en el script y envueltos los identificadores entre comillas dobles estamos condenados a usar comillas dobles y mayúsculas siempre que nos referimos al objeto o a su attributes:
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 lo hacen, pero son lo suficientemente disciplinados como para poner todos los nombres de sus objetos en MAYÚSCULAS).
El reverso también es true. Si creamos la tabla sin utilizar comillas dobles…
create table PS_TBL_DEPARTMENT_DETAILS
( company_code VARCHAR2(255),
company_name VARCHAR2(255),
Cost_Center_Number VARCHAR2(255))
;
… podemos referenciarlo y sus columnas en cualquier caso que nos apetezca:
select * from ps_tbl_department_details
… o
select * from PS_TBL_DEPARTMENT_DETAILS;
… o
select * from PS_Tbl_Department_Details
where COMAPNY_CODE = 'ORCL'
and cost_center_number = '0980'
En mi caso, ocurrió este error, 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 de mapeo hbm.
Después de modificar la tabla, funcionó bien.
FYI, en este caso se encontró que la causa era mixed nombre de columna de caso en el DDL para la creación de tablas.
Sin embargo, si está mezclando “estilo antiguo” y uniones ANSI, podría obtener el mismo mensaje de error incluso cuando el DDL se haya realizado correctamente con el nombre de la tabla en mayúsculas. Esto me sucedió y Google me envió a esta página de stackoverflow, así que pensé en compartir ya que estaba 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 error Oracle tiene un 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 algunas investigaciones sobre esto en la siguiente publicación de blog:
- http://sqlfascination.com/2013/08/17/oracle-ansi-vs-old-style-joins/
En mi caso, estaba intentando convertir manualmente del estilo antiguo al estilo ANSI, y lo estaba haciendo 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 de ubicación en la consulta original para compararla con la nueva consulta ANSI que está escribiendo.