为什么即使列存在我也会出现ORA-00904错误?

40

执行Hibernate SQL查询时出现错误。

java.sql.SQLException: ORA-00904:"table_name"."column_name":无效标识符

在sqldeveloper中打开表时,该列是存在的。

这个错误只发生在PROD环境中,而不是DEV环境中。

我应该检查什么?


1
我认为更大的问题可能是列没有被传输到生产数据库。 - V4Vendetta
@Kaushik,你找出问题的原因了吗? - Rajesh Chamarthi
1
在我的情况下,经过大量调试,一个列名被拼写错误。 - shareef
跟@shareef所说的一样,我也是这种情况。 - Derrick
我遇到了同样的问题,这个错误只会在生产系统中发生。 - ThanhLD
14个回答

38

ORA-00904-invalid identifier 错误通常由大小写问题引起。通常情况下,Oracle 的表和列名不区分大小写,也不能包含标点符号和空格。但如果您使用双引号创建引用标识符,那么该标识符必须始终用双引号引用,并且大小写必须正确。例如:

create table bad_design("goodLuckSelectingThisColumn  " number);

在我的情况下,这是因为大小写敏感性的问题;所以我将我的 Oracle 数据库中的列名从 column_name 重命名为 COLUMN_NAME,问题得到了解决。 - hakima maarouf

10

如果执行用户没有足够的权限来访问查询涉及到的对象,Oracle 会抛出 ORA-00904 错误。


8
当我无意中使用相同的持久数据库表定义了两个实体时,就会发生这种情况。在其中一个表中,存在所涉及的列,在另一个表中则不存在。当尝试持久化一个对象(类型引用错误的基础数据库表)时,就会出现此错误。

5

请将列名用双引号括起来,如 "columnName"。

如果错误信息显示的字符大小写与您所写的不同,则很可能是您的SQL客户端自动执行了大小写转换。使用双引号来绕过这个问题。(Squirrell Client 3.0中适用)。


4
由于其中一个数据库列是用“”创建的,这使得它的名称区分大小写。
Oracle表列名:GoodRec Hive无法识别大小写:抛出错误 - Caused by: java.sql.SQLSyntaxErrorException: ORA-00904:“GOODREC”:无效标识符
解决方案:将Oracle列名重命名为全大写。

3
检查Java类字段的Column注释位置,例如,考虑一个名为STUDENT的表,有3列(Name、Roll_No、Marks)。
然后确保您已经在Getter方法之前添加了以下Column注释,而不是Setter方法。这将解决您的问题。 @Column(name = "Name", length = 100)
**@Column(name = "NAME", length = 100)
public String getName() {**
    return name;
}

    public void setName(String name) {
    this.name= name;
}

2

你是否比较过生产环境和开发环境的表定义?

当你在SQL Developer中运行查询时,是否使用与应用程序相同的数据库和用户在生产环境中运行查询?

如果你正在添加一些额外的列(使用alter命令),而这些更改尚未推广到生产环境,那么可能会出现此问题。

你能否发布表的定义和实际查询?


1
似乎Oracle在许多情况下都会抛出这个错误。
对我而言,是因为我试图限定一个在连接部分的using子句中使用的列。 这两种方式都不起作用:
select table1.x -- doesn't work
from table1
join table2 using (x);

select t1.x -- doesn't work
from table1 t1
join table2 t2 using(x);

这是因为我们可以在using子句中不使用表名或别名对列进行合格化。正确的方式应该是:

select x
from table1
join table2 using (x);

select x
from table1 t1
join table2 t2 using(x);

1

我看到了一个与上述原因略有不同的错误:

我使用了liquibase脚本来修改我的已存在的(Oracle)表。一切看起来都很好,但我的代码中的插入操作失败了。只有当我看到SQL Developer自动完成时提供了引号时,我才看到在创建时列名后面附加了一个空格。

有问题的liquibase changeSet行如下(在'MY_FIELD'结束引号前有单个空格):

<addColumn tableName="MY_TABLE">
    <column name="MY_FIELD " type="tinyint" defaultValueNumeric="3">
        <constraints nullable="false"/>
    </column>
</addColumn>

请纠正我如果我错了。您是指 https://dev59.com/Z2025IYBdhLWcg3wZlLd 吗? - Nadeem Taj
1
嗨,Nadeem - 不,我指的是当我尝试插入到的列(加上一个不可见的空格)存在时,我遇到的ORA-00904错误,这篇文章。虽然也许另一篇文章提出了类似的问题,但我没有详细阅读它。编辑:话虽如此,这是相同的错误消息(尽管我用不同的语言得到了它),但我并不知ingly地参考了其他帖子 ;) - H.C.

0

我使用Toad for Oracle,如果表格的所有者与您登录的用户名不同,并且您有权读取该表格,则仍然可能需要将原始表格所有者添加到表格名称中。

例如,假设表格所有者的名称为“OWNER1”,而您已登录为“USER1”。这个查询可能会给你一个ORA-00904错误:

select * from table_name where x='test';

在表名前加上表所有者的前缀可以消除错误并得到结果:

select * from 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接