【问题标题】:Why do I have ORA-00904 even when the column is present?为什么即使存在列,我也会有 ORA-00904?
【发布时间】:2011-08-09 00:49:08
【问题描述】:

执行休眠 sql 查询时出现错误。

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

当我在 sqldeveloper 中打开表时,该列存在。

该错误仅发生在 PROD 中,而不发生在 DEV 中。

我应该检查什么?

【问题讨论】:

  • 我相信更大的问题可能是列没有进入生产数据库
  • @Kaushik.. 你找出问题的原因了吗?
  • 在我的情况下,经过大量调试后,一列拼写错误
  • 和@shareef 说的一样
  • 我遇到了同样的问题,这个错误只发生在 Prod 系统中。

标签: oracle oracle10g ora-00904


【解决方案1】:

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

create table bad_design("goodLuckSelectingThisColumn  " number);

【讨论】:

    【解决方案2】:

    如果执行用户对查询中涉及的对象没有适当的权限,Oracle 将抛出 ORA-00904

    【讨论】:

      【解决方案3】:

      当我不小心用同一个持久数据库表定义了两个实体时,这发生在我身上。在其中一个表中,有问题的列确实存在,而在另一个表中不存在。当试图持久化一个对象(类型引用错误的基础数据库表)时,发生了这个错误。

      【讨论】:

        【解决方案4】:

        将列名写在双引号之间,如“columnName”。

        如果错误消息显示的字符大小写与您编写的不同,则很可能您的 sql 客户端为您执行了自动大小写转换。使用双引号绕过它。 (这适用于 Squirrell Client 3.0)。

        【讨论】:

          【解决方案5】:

          这是因为创建该列的 DB 之一是使用 " 使其名称区分大小写。

          Oracle 表列名:GoodRec Hive 无法识别区分大小写:抛出的错误是 - 原因:java.sql.SQLSyntaxErrorException: ORA-00904: "GOODREC": invalid identifier

          解决方案:将 Oracle 列名重命名为全部大写。

          【讨论】:

            【解决方案6】:

            检查字段的java类中Column注解的位置 例如,考虑一个名称为 STUDENT 的表,其中包含 3 列(名称、Roll_No、Marks)。

            然后确保您在 Getter 方法之前 列的下方添加了注释,而不是 Setter 方法。它会解决你的问题 @Column(name = "名称", length = 100)

            **@Column(name = "NAME", length = 100)
            public String getName() {**
                return name;
            }
            
                public void setName(String name) {
                this.name= name;
            }
            

            【讨论】:

              【解决方案7】:

              您是否比较过 Prod 和 Dev 中的表定义?

              当您在 SQL Developer 中运行它时,您是否在 Prod(与应用程序相同的数据库)中使用相同的用户运行查询?

              如果您要添加一些额外的列(使用 alter 命令)并且这些更改尚未升级为 prod,则可能会出现此问题。

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

              【讨论】:

                【解决方案8】:

                好像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);
                

                【讨论】:

                  【解决方案9】:

                  我看到这个错误的原因与上面给出的稍有不同:

                  我使用 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>
                  

                  【讨论】:

                  • 如果我错了,请纠正我。你指的是stackoverflow.com/questions/6027961/…
                  • 嗨 Nadeem - 不,我指的是当我试图插入的列(加上一个不可见的空间)出现时出现的 ORA-00904 错误,这篇文章。尽管可能另一篇文章提出了类似的问题,但我没有详细介绍它。编辑:话虽如此,这是相同的错误消息(尽管我用不同的语言得到它),但我不是故意指其他帖子;)
                  【解决方案10】:

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

                  例如,假设表所有者的名称是“OWNER1”,而您以“USER1”的身份登录。此查询可能会给您一个 ORA-00904 错误:

                  select * from table_name where x='test';
                  

                  在 table_name 前加上表所有者可以消除错误并给出结果:

                  select * from 
                  

                  【讨论】:

                    【解决方案11】:

                    这是由于实体中定义的列名与表的列名不匹配(在 SQL db 中)

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

                    问题可以像 在 Student.java(实体文件)
                    您仅将列名称称为“NAME”。
                    但是在 STUDENT 表中,列名可以说是“NMAE”

                    【讨论】:

                      【解决方案12】:

                      检查 Oracle 中的同义词声明。我正在调用如下的 PL/SQL 函数,它给出 java.sql.SQLSyntaxErrorException: ORA-00904: invalid identifier

                      select oracle_my_pkg.notify_list_function from dual
                      

                      在声明 oracle_my_pkg 的公共同义词后,错误消息消失了

                      【讨论】:

                        【解决方案13】:

                        检查用于登录数据库的用户名凭据。 (persistence.xml ??)。问题主要是,用于登录数据库的用户名\密码对对象(本例中的 table_name)不可见。 (尝试使用您数据源中可用的相同用户名\密码登录到 sql developer)

                        【讨论】:

                        • 那不是给出了一个未找到的表吗? SQL> 从 invalid_table_name 中选择 colA; select colA from invalid_table_name * ERROR at line 1: ORA-00942: table or view does not exist
                        • 没有persistence.xml。 Hibernate 正在使用 websphere 上定义的数据源
                        • 我并不是说表对象不存在。我是说存在可见性问题。他不是说他登录到sqldeveloper,发现一切正常吗……我唯一能想到的是,用户名不同。 (模式)
                        • 然后检查您的数据源配置。它应该有正确的连接字符串和用户名\密码凭据...(在 jboss 中它的 oracle-ds.xml .. 我不知道 abt Websphere。
                        • 我想说的是,如果存在可见性问题(授权),那么错误将是“表不存在”。 OP 发布的错误表明他可以访问该表,但缺少列名或者他错误地使用了列名的别名。
                        【解决方案14】:

                        创建一个新表。 但不要在“(双引号)中给出值 这看起来像是唯一的解决方案

                        create table bad_design(goodLuckSelectingThisColumn  number);
                        

                        安装

                        create table bad_design("goodLuckSelectingThisColumn  " number);
                        

                        【讨论】:

                        • 欢迎来到 StackOverflow。除了接受的答案之外,您的答案没有提供任何其他信息。请以有价值的见解扩展它或删除您的帖子。
                        猜你喜欢
                        • 1970-01-01
                        • 2018-06-14
                        • 2020-10-25
                        • 2011-06-14
                        • 2022-06-30
                        • 2018-04-10
                        • 2011-11-05
                        • 2021-06-19
                        • 2021-08-21
                        相关资源
                        最近更新 更多