ORA-00904:无效的标识符
我尝试使用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
这给出了以下错误:
INNER JOIN PS_TBL_DEPARTMENT_DETAILS Team ON Team.DEPARTMENT_CODE = Employee.DEPTID * ERROR at line 4: ORA-00904: "TEAM"."DEPARTMENT_CODE": invalid identifier
一个表的DDL是:
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
你的问题是那些有害的双引号。
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允许我们忽略数据库对象名称的情况,只要我们使用大写的名称创build它们,或者不使用双引号。 如果我们在脚本中使用混合大小写或小写字母,并将标识符用双引号括起来,那么我们就会使用双引号和精确的情况来引用对象或其属性:
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;博士
不要在DDL脚本中使用双引号
(我知道大多数第三方代码生成器都这么做,但是他们已经足够严格,可以将所有对象名称都放在大写字母中。)
在我的情况下,这个错误发生,由于表中缺less列名的存在。
当我执行“ describe tablename
”时,我无法find映射HBM文件中指定的列。
改变表后,它工作正常。
DEPARTMENT_CODE不是表格Team中存在的列。 检查表的DDL以find正确的列名称。
仅供参考,在这种情况下,原因被发现是DDL中用于表创build的混合大小写字段名称。
但是,如果混合使用“旧样式”并且ANSIjoin,则即使DDL使用大写的表名正确完成,也可能会得到相同的错误消息。 这发生在我身上,谷歌送我到这个stackoverflow页面,所以我想我会分享,因为我在这里。
--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 /
上面的两个SQL语句是等价的,不会产生错误。
当您尝试混合使用时,您可能会感到幸运,或者您可能会遇到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 /
而无用的错误信息并没有真正描述这个问题:
>[Error] Script lines: 1-12 ------------------------- ORA-00904: "A"."EMPLID": invalid identifier Script line 6, statement line 6, column 51
我在以下博客文章中find了一些关于这方面的研究:
在我的情况下,我试图手动从旧风格转换为ANSI风格的联接,并逐渐增加,一次一个表。 这似乎是一个坏主意。 相反,最好一次转换所有表,或者在原始查询中注释一个表及其条件,以便与您正在编写的新ANSI查询进行比较。
你确定你的桌子上有一个DEPARTEMENT_CODE列吗? PS_TBL_DEPARTMENT_DETAILS
有关您的错误的更多信息
ORA-00904:string:无效标识符原因:input的列名缺失或无效。 操作:input一个有效的列名称。 有效的列名必须以字母开头,less于或等于30个字符,并且只包含字母数字字符和特殊字符$,_和#。 如果它包含其他字符,则必须用双引号括起来。 它可能不是保留字。
我在使用eclipse链接的JPA 2中有相同的exception。 我有一个@embedded类与一个实体的一对一的关系。 错误的是,在embedded式类中,我也有注解@Table(“TRADER”)。 当JPA从实体创build数据库时,它也创build了一个表TRADER(这是一个错误,因为交易实体被embedded到主实体中),并且该表的存在导致了上面的例外,每当我尝试坚持我的实体。 删除TRADER表后,exception消失。
还要确保发出查询的用户已被授予必要的权限。
对于查询表,您需要授予SELECT权限。
对于其他对象types(例如存储过程)的查询,您需要授予EXECUTE权限。
我传递的价值没有引号。 一旦我通过单引号内条件的工作就像一个魅力。
Select * from emp_table where emp_id=123;
而不是上面的使用这个:
Select * from emp_table where emp_id='123';