避免 ORA-00904 - 在 java 中进行 sql 查询时出现无效标识符错误,因为该列可能会或可能不会在数据库中预设

Posted

技术标签:

【中文标题】避免 ORA-00904 - 在 java 中进行 sql 查询时出现无效标识符错误,因为该列可能会或可能不会在数据库中预设【英文标题】:Avoid ORA-00904 - invalid identifier error while doing sql query in java as the column may or may not be preset in the database 【发布时间】:2019-11-22 15:04:10 【问题描述】:

我正在尝试编写java 代码以将数据从oracle database 迁移到其他数据库。 我的用例是不同的客户端有不同版本的代码,因此数据库列可能会有所不同。更高版本的客户端有额外的列。 例如:新版本为COL99的客户端在表SAMPLE_TABLE中。

在编写迁移代码时,如果我尝试从SAMPLE_TABLE 中选择COL99,它将适用于新客户端。但是对于旧版本的客户端,代码失败了

ORA-00904 标识符无效错误。

有没有办法在sql查询或java代码中处理,如果数据库表中不存在该列,只需忽略并且不返回值而不是抛出异常。

【问题讨论】:

想必你想先在 oracle 中查询 all_tab_columns 以查看该列是否存在,而不是作为事后错误处理。 您是否维护任何用于识别应用程序版本的表格? @JoshEller 同意,这是一个可能的解决方案。但是我在迁移项目中有很多表和很多列。所以这种方法不太可行。 【参考方案1】:

您应该首先检查您当前的数据库连接是否存在COL99。 对于 Oracle,您可以使用如下查询:

SELECT
  COL.COLUMN_ID,
  COL.OWNER AS SCHEMA_NAME,
  COL.TABLE_NAME,
  COL.COLUMN_NAME
FROM
  SYS.ALL_TAB_COLUMNS COL
  INNER JOIN
  SYS.ALL_TABLES T 
  ON COL.OWNER = T.OWNER
     AND
     COL.TABLE_NAME = T.TABLE_NAME
WHERE
  COL.OWNER = 'SCHEMA'
  AND
  COL.TABLE_NAME = 'SAMPLE_TABLE'
  AND
  COL.COLUMN_NAME = 'COL99'

然后,您可以使用或不使用COL99 创建查询。

【讨论】:

这种方法是一种可能的解决方案。但是在我们的迁移项目中,我们有很多表和很多列。查询会变得很复杂,也不是很干净。 它认为,没有办法忽略查询中丢失的列。也许你事先添加缺失的列(使用适当的默认值)更方便,这样你就可以保持查询不变。

以上是关于避免 ORA-00904 - 在 java 中进行 sql 查询时出现无效标识符错误,因为该列可能会或可能不会在数据库中预设的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLSyntaxErrorException: ORA-00904: : 标识符无效

PL/SQL JAVA ORACLE 错误 ORA-00904: 标识符无效

ORA-00904: 无效标识符 00904. 00000 - "%s: 无效标识符"

SQL 代码在转换为 JPQL 代码时不起作用(ORA-00904 错误代码)

ORA-00904: "CEILING": ORACLE 11G 中的标识符无效

ORA-00904: "pass": 无效的标识符