Как преобразовать набор результатов в БД в операторы слияния в Java? - PullRequest
0 голосов
/ 24 октября 2018

У меня есть 2 схемы.

Я хочу сначала выполнить запрос выбора в моей исходной схеме, затем преобразовать набор результатов в операторы слияния и объединить его в схему назначения.

Возможно ли это?

Причина, по которой не выполняется вставка, связана с тем, что в схеме назначения уже существует запись, которая при вставке выдаст уникальное ограничение.

Добавление еще одного пункта: исходная и целевая базы данных находятся наразные серверы.

1 Ответ

0 голосов
/ 25 октября 2018

Возможно ли это?

Не уверен, почему вы думаете, что это невозможно.Какие-то конкретные причины?

Я отвечаю, поскольку вы пометили его как jdbc , что означает, что вы ищете решение, не зависящее от БД, и исключительно на Java.

Слияние означает - обновить строку, если строка уже существует в целевой базе данных, в противном случае вставить новую строку в целевую базу данных (критерии поиска являются первичным ключом).

Поэтому запустите выборисходная база данных, итерация по ней и в цикле итерации

  1. запустить выборку целевой базы данных для столбцов первичного ключа в WHERE предложении
  2. Если результат найден вtarget db - создать UPDATE PreparedStatement, установить значения в подготовленном операторе обновления из исходных данных и добавить в пакет (т.е. не выполнять его)

  3. , если строка не найденана шаге 2 создайте INSERT PreparedStatement, установите значения в подготовленном операторе из исходных данных и добавьте в пакет

  4. Если порог партии достигнут, выполните партии, подготовленные на шагах 2 и 3.
  5. Перейти к шагу # 1.

В качестве альтернативы, вы можете попробовать вставить отдельные строки, и если выдается нарушение ограничения, попробуйте обновить эту строку в блоке catch.При таком подходе операторы insert & batch не могут выполняться пакетами, как указано выше.

Третий подход заключается в прямом использовании оператора MERGE (если целевая БД поддерживает его), как показано здесь , посмотрите на метод - public static void MergeTables(Connection conn).MERGE может быть выполнен с помощью операторов jdbc, метод executeUpdate.

Обратите внимание, что проблема, связанная с вышеуказанными шагами, связана только с производительностью при выполнении шага № 1 в цикле - может быть слишком много вызовов БД для большого объема данных.Так что этот вид работы обычно выполняется в специализированных инструментах ETL (Informatica и т. Д.) Или PL / SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...