Избегайте ORA-00904 - ошибка неверного идентификатора при выполнении SQL-запроса в Java, поскольку столбец может быть или не быть предварительно заданным в базе данных

Я пытаюсь написать java код для переноса данных из oracle database в другую базу данных. Мой вариант использования заключается в том, что у разных клиентов разные версии кода, поэтому столбцы базы данных могут различаться. Клиенты с более поздней версией имеют дополнительный столбец. Например: клиент с новой версией как COL99 в таблице SAMPLE_TABLE.

При написании кода миграции, если я попытаюсь выбрать COL99 из SAMPLE_TABLE, он будет нормально работать для нового клиента. Но для клиентов старой версии код не работает с

ORA-00904 Ошибка неверного идентификатора.

Есть ли способ обработки запроса sql или кода java таким образом, чтобы, если столбец не существует в таблице базы данных, просто игнорировать и не возвращать значение вместо создания исключения.


person user3755000    schedule 22.11.2019    source источник
comment
Предположительно, вы хотели бы сначала запросить all_tab_columns в оракуле, чтобы увидеть, существует ли столбец или нет, а не делать это как постфактум обработки ошибок.   -  person Josh Eller    schedule 22.11.2019
comment
Поддерживаете ли вы какую-либо таблицу для определения версии вашего приложения?   -  person Popeye    schedule 22.11.2019
comment
@JoshEller согласен, это возможное решение. но у меня много таблиц и много столбцов в проекте миграции. Так что этот способ менее осуществим.   -  person user3755000    schedule 25.11.2019


Ответы (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 или без него.

person vanje    schedule 22.11.2019
comment
Такой подход является возможным решением. но в нашем проекте миграции у нас много таблиц и много столбцов. Запрос станет очень сложным и не очень чистым. - person user3755000; 25.11.2019
comment
Думаю, нет способа игнорировать отсутствующие столбцы в запросах. Возможно, вам будет удобнее добавить отсутствующие столбцы заранее (с соответствующим значением по умолчанию), чтобы вы могли оставить запросы без изменений. - person vanje; 25.11.2019