避免 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 错误代码)