оракул - перемещение данных из одной базы данных - PullRequest
0 голосов
/ 26 сентября 2011

У меня есть две базы данных с одинаковым расположением таблиц. Есть дюжина или около того таблиц интересов. Они - ряд ФК между ними.

Меня попросили написать хранимую процедуру для копирования данных из базы данных A в базу данных B на основе PK родительской таблицы в верхней части иерархии. Я могу получить только одно значение или список значений. Я должен выбрать все записи из базы данных A, которые соответствуют значению (ям), и вставить / обновить их в базе данных B. Это включает и все записи в дочерних таблицах.

Мои вопросы - какой самый лучший (самый эффективный / лучший метод) способ сделать это?

Должен ли я написать дюжину выбора из ... вставить в ... заявления?

Должен ли я объединить таблицы вместе, чтобы попытаться вставить их во все таблицы одновременно?

Спасибо!

Дополнительная информация: Запись должна быть вставлена, если ее там еще нет. (на основе PK соответствующей таблицы). В противном случае оно должно быть обновлено.

Очевидно, мне нужно перейти ко всем дочерним таблицам, так что в родительской таблице будет только одна запись, но дочерняя таблица может иметь 10, а дочерняя таблица может иметь 500. Мне, конечно, понадобится чтобы обновить запись, если она уже существует, вставьте ее, если это не касается дочерних таблиц ...

UPDATE: Я думаю, что это упростило бы решение, если бы я просто удалил все записи, связанные с ключом верхнего уровня, а затем вставил бы все новые записи, а не пытался делать обновления.

Так что я думаю, что вопросы лучше всего сделать дюжину:

delete from ... where ... in ...

select from ... where ... in ...
insert into...

или лучше сделать какие-нибудь необычные объединения, чтобы сделать все вставки в одном выражении sql?

1 Ответ

2 голосов
/ 26 сентября 2011

Я бы сделал это, отключив все ограничения внешнего ключа, затем выполнив набор операторов MERGE для обработки обновлений и вставок, а затем включив все ограничения.

Подумайте о регистрации. Сколько повторов вы хотите сгенерировать?

Вы можете обнаружить, что быстрее и лучше обрезать все целевые таблицы, а затем выполнять вставку всего с помощью nolog. Может быть проще, чем слияния.

Одной из основных альтернатив является удаление всех целевых таблиц и использование экспорта и импорта. Может быть, намного быстрее.

Второй альтернативой будет использование материализованных представлений, особенно если вам не нужно обновлять целевые таблицы. Таким образом, Oracle сделает всю тяжелую работу за вас. Вы можете добиться целостности, тщательно выбирая группы обновлений.

Существует несколько способов решения этой бизнес-проблемы. Программа на PL / SQL может быть не самой лучшей.

...