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

避免ORA-00904-在java中执行sql查询时出现无效标识符错误,因为该列可能在数据库中预设,也可能未预设,java,sql,oracle,ora-00904,Java,Sql,Oracle,Ora 00904,我正在尝试编写java代码,以便将数据从oracle数据库迁移到其他数据库。 我的用例是,不同的客户机有不同版本的代码,因此数据库列可能会有所不同。具有更高版本的客户端具有附加列。 例如:新版本为COL99的客户机,见表SAMPLE\u表 在编写迁移代码时,如果我尝试从SAMPLE_表中选择COL99,它将对新客户端正常工作。但对于旧版本的客户机,代码会失败 ORA-00904无效标识符错误 是否有一种方法可以在sql查询或java代码中进行处理,如果该列在数据库表中不存在,只需忽略该列,不返回

我正在尝试编写
java
代码,以便将数据从
oracle数据库
迁移到其他数据库。 我的用例是,不同的客户机有不同版本的代码,因此数据库列可能会有所不同。具有更高版本的客户端具有附加列。 例如:新版本为
COL99
的客户机,见表
SAMPLE\u表

在编写迁移代码时,如果我尝试从
SAMPLE_表
中选择
COL99
,它将对新客户端正常工作。但对于旧版本的客户机,代码会失败

ORA-00904无效标识符错误


是否有一种方法可以在
sql
查询或
java
代码中进行处理,如果该列在数据库表中不存在,只需忽略该列,不返回该值,而不是抛出异常。

您应该首先检查当前数据库连接是否存在
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

创建查询,您可能希望首先查询oracle中的所有_tab_列,以查看该列是否存在,而不是在事实错误处理之后执行此操作。是否维护任何表来标识应用程序的版本?@JoshEller同意,这是一个可能的解决方案。但是我在迁移项目中有很多表和列。因此,这种方法不太可行。这种方法是一种可能的解决方案。但是在我们的迁移项目中,我们有许多表和列。查询将变得非常复杂且不干净。它认为,无法忽略查询中缺少的列。也许预先添加缺少的列(使用适当的默认值)更方便,这样就可以保持查询不变。