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
I tried to write the following inner join query using an Oracle database:
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
That gives the below 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
The DDL of one table is:
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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(15)
你的问题是那些有害的双引号。
Oracle SQL 允许我们忽略数据库对象名称的大小写,前提是我们使用全部大写的名称创建它们,或者不使用双引号。如果我们在脚本中使用混合大小写或小写字母并将标识符括在双引号中,则每当我们引用对象或其属性时,我们都必须使用双引号和精确的大小写:
tl;dr
don不要在 DDL 脚本中使用双引号
(我知道大多数第三方代码生成器都会这样做,但他们有足够的纪律将所有对象名称都放在大写中。)
反之亦然。如果我们在不使用双引号的情况下创建表……
我们可以在任何我们喜欢的情况下引用它及其列:
……或
……或
Your problem is those pernicious double quotes.
Oracle SQL allows us to ignore the case of database object names provided we either create them with names all in upper case, or without using double quotes. If we use mixed case or lower case in the script and wrapped the identifiers in double quotes we are condemned to using double quotes and the precise case whenever we refer to the object or its attributes:
tl;dr
don't use double quotes in DDL scripts
(I know most third party code generators do, but they are disciplined enough to put all their object names in UPPER CASE.)
The reverse is also true. If we create the table without using double-quotes …
… we can reference it and its columns in whatever case takes our fancy:
… or
… or
就我而言,由于表中不存在列名,因此发生了此错误。
当我执行“
describe tablename
”时,我无法找到映射 hbm 文件中指定的列。修改表后,效果很好。
In my case, this error occurred, due to lack of existence of column name in the table.
When i executed "
describe tablename
" , i was not able to find the column specified in the mapping hbm file.After altering the table, it worked fine.
仅供参考,在这种情况下,发现原因是创建表的 DDL 中混合大小写的列名。
但是,如果您混合使用“旧式”和 ANSI 连接,即使使用大写表名正确完成 DDL,您也可能会收到相同的错误消息。这发生在我身上,谷歌将我发送到这个 stackoverflow 页面,所以我想我应该分享,因为我在这里。
上面的两个 SQL 语句是等效的并且不会产生错误。
当您尝试混合使用它们时,您可能会很幸运,或者您可能会收到 Oracle 有 ORA-00904 错误的信息。
而无用的错误消息根本没有真正描述问题:
我可以在以下博客文章中找到对此的一些研究:
中在我的例子中,我试图手动从旧样式连接转换为 ANSI 样式连接,并且一次一个表增量地执行此操作。这似乎是一个坏主意。相反,最好一次转换所有表,或者注释掉原始查询中的表及其 where 条件,以便与您正在编写的新 ANSI 查询进行比较。
FYI, in this case the cause was found to be mixed case column name in the DDL for table creation.
However, if you are mixing "old style" and ANSI joins you could get the same error message even when the DDL was done properly with uppercase table name. This happened to me, and google sent me to this stackoverflow page so I thought I'd share since I was here.
The two SQL statements above are equivalent and produce no error.
When you try to mix them you can get lucky, or you can get an Oracle has a ORA-00904 error.
And the unhelpful error message that doesn't really describe the problem at all:
I was able to find some research on this in the following blog post:
In my case, I was attempting to manually convert from old style to ANSI style joins, and was doing so incrementally, one table at a time. This appears to have been a bad idea. Instead, it's probably better to convert all tables at once, or comment out a table and its where conditions in the original query in order to compare with the new ANSI query you are writing.
DEPARTMENT_CODE 不是 Team 表中存在的列。检查表的 DDL 以找到正确的列名。
DEPARTMENT_CODE is not a column that exists in the table Team. Check the DDL of the table to find the proper column name.
就我而言,当我尝试在 Oracle 中创建一个新表时出现此错误,如下所示,在最后一行使用
,
通过删除
,
问题解决如下In my case I got this error when I tried to create a new table in Oracle like this with
,
in last lineBy removing
,
the problem solved like this您确定您的表格上有一列 DEPARTMENT_CODE PS_TBL_DEPARTMENT_DETAILS
更多信息
Are you sure you have a column DEPARTEMENT_CODE on your table PS_TBL_DEPARTMENT_DETAILS
More informations about your ERROR
我在尝试通过 JPA 保存实体时遇到此错误。
这是因为我有一个带有
@JoinColumn
注释的列,但没有@ManyToOne
注释。添加
@ManyToOne
解决了该问题。I had this error when trying to save an entity through JPA.
It was because I had a column with
@JoinColumn
annotation that didn't have@ManyToOne
annotation.Adding
@ManyToOne
fixed the issue.还要确保发出查询的用户已被授予必要的权限。
对于表查询,您需要授予 SELECT 权限。
对于其他对象类型(例如存储过程)的查询,您需要授予 EXECUTE 权限。
Also make sure the user issuing the query has been granted the necessary permissions.
For queries on tables you need to grant SELECT permission.
For queries on other object types (e.g. stored procedures) you need to grant EXECUTE permission.
我有同样的例外,我的情况的问题是由于该列不存在于子查询中 - 尽管我知道“丢失”列/标识符属于我所指的别名的表。
示例 - 此查询在
MC.SIT_TYPE
列生成 ORA-00904 - 无效标识符:现在,修改子查询后 - 通过添加
MC.SIT_TYPE
列 - 后,ORA-00904
消失。结果:
这里有一些提示:
I had the same exception and the problem in my case was due the column was not present in the sub-query - despite I know the "missing" column/identifier belongs to the table with the alias I'm referring to.
Example - this query generates the ORA-00904 - invalid identifier at the column
MC.SIT_TYPE
:Now, after modify the sub-query - by adding the
MC.SIT_TYPE
column - , theORA-00904
disapears.Result:
Here are some tips:
我在使用 eclipse link 的 JPA 2 中遇到了同样的异常。我有一个与实体具有一对一关系的 @embedded 类。
错误地,在嵌入类中,我还有注释 @Table("TRADER")。当 JPA 从实体创建数据库时,它还创建了一个 TRADER 表(这是一个错误,因为 Trader 实体嵌入到主实体中),并且每次我尝试时,该表的存在都会导致上述异常坚持我的实体。
删除 TRADER 表后,异常消失。
I had the same exception in JPA 2 using eclipse link. I had an @embedded class with one to one relationship with an entity.
By mistake ,in the embedded class, i had also the annotation @Table("TRADER"). When the DB was created by the JPA from the entities it also created a table TRADER (which was a wrong as the Trader entity was embedded to the main entity) and the existence of that table was causing the above exception every time i was trying to persist my entity.
After deleting the TRADER table the exception disappered.
我传递的值不带引号。一旦我通过了单引号内的条件,它就像一个魅力。
使用以下内容代替上面的内容:
I was passing the values without the quotes. Once I passed the conditions inside the single quotes worked like a charm.
instead of the above use this:
我收到错误消息是因为我错过了一个表别名并且没有使用。
由于“cl”别名,这会引发错误:
没有“cl”,它可以正常工作:
请不要抱怨表名 - 该模式已有 20 年历史了...
I got the error message because there was an table alias i missed and didn't use.
This throws the error because of the 'cl' alias:
Without 'cl' it works fine:
Please don't complain about the table names - the schema is 20 years old...
就我而言,错误是由于使用列名错误的大小写而引起的,看来您也遇到了同样的问题。
Department_Code
与 Oracle 的DEPARTMENT_CODE
不同。In my case the error was caused by using the wrong case for a column name and it seems you're having the same issue.
Department_Code
isn't the same asDEPARTMENT_CODE
for Oracle.今天我从数据库中得到了同样的错误。我的错误是我为休眠配置了错误的默认模式。
Today I got the same error from my database. My fault was that I had configured a wrong default schema for hibernate.
查询行导致错误
Query line caused the error ????❌
Solved by putting two single quotation ????✅