Слияние данных между двумя отдельными базами данных Oracle - PullRequest
1 голос
/ 08 февраля 2012

У меня есть две отдельные, неподключенные и неподключаемые базы данных Oracle.Мне нужно быстро и безболезненно передавать информацию от одного к другому.

Обычно я делал до сих пор, когда в этой ситуации создаю промежуточную область для данных, которые необходимо импортировать (по сути, временная таблица только для хранения данных, пока я не закончу слияние).Я копирую все данных, которые могут понадобиться из источника в эту область подготовки.Затем я объединяю данные, как если бы две таблицы были соединены, что, конечно, означает, что я могу отфильтровать любые данные, которые мне не нужны в то время.

Вот проблема в моем текущем случае.Исходная таблица чрезвычайно большая и полностью неиндексированная (что-то, что я не могу контролировать, тьфу).Это означает, что навсегда требуется, чтобы получить необходимые данные, если я не фильтрую их каким-либо образом.Кроме того, таблице назначения действительно требуется только относительно небольшое подмножество данных, чтобы выполнить то, что ей нужно, возможно, десять тысяч или около того отдельных строк одновременно.В этом случае я не хочу копировать все данных, которые могут понадобиться .Я просто хочу скопировать точные данные, которые будут необходимы или максимально приближены к этому.

tl: dr version

Как конкретно я могу ограничить свой выбор исходной таблицы на основе того, что мне нужно в таблице назначения, если они не могут общаться друг с другом?

Например, я мог бы выбрать идентификаторы дляданные, которые необходимы в месте назначения и на основе этого строят запрос для исходной таблицы.Однако это может привести к появлению запроса со многими тысячами предложений OR:

SELECT x, y FROM z WHERE (ID = 1 OR ID = 2 ... OR ID = 10000 OR ID = 10001...)

или что-то в этом роде.Есть ли лучший способ сделать это?

Ответы [ 4 ]

3 голосов
/ 08 февраля 2012

Можете ли вы временно создать dblink между двумя базами данных oracle?Это позволит вам создать оператор SQL, который ссылается на таблицы из двух разных баз данных.

1 голос
/ 08 февраля 2012

Есть ли межсетевой экран или что-то, препятствующее связи экземпляров БД?
Если это так, вы всегда можете извлечь из источника источник данных с разделителями-вкладками, а затем загрузить их в целевой объект. Выбор может выглядеть примерно так:

SELECT x, y FROM z WHERE ID IN (1, 2, ..., 10000, 10001, ...)

Если слишком много элементов в списке, вы можете поместить свои элементы в списке во временную таблицу и присоединиться к ней. ИЛИ следуйте примеру Тома Кайта: http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:210612357425 http://tkyte.blogspot.com/2006/06/varying-in-lists.html

Самое простое, что нужно сделать - это ссылка на исходный экземпляр из целевого экземпляра, а затем сказать что-то вроде:

insert into staging (SELECT x, y FROM z@linkname WHERE ID IN (1, 2, ..., 10000, 10001, ...))
0 голосов
/ 15 января 2015

Вы можете использовать dbms_output для передачи данных в исходную базу данных в массив.А затем используйте массив в предложении select.Вот как это будет работать в sqlplus

VARIABLE cur REFCURSOR

declare t DBMSOUTPUT_LINESARRAY;
    numlines integer;
    c sys_refcursor;
begin
  dbms_output.enable;
  dbms_output.put_line(100);
  dbms_output.put_line(116);
  -- add more object ids ....
  dbms_output.get_lines(t,numlines);
  open :cur for select object_id,object_name 
   from all_objects o where o.object_id in 
   (select * from table(t));
end;
/

print cur

дает мне:

PL/SQL procedure successfully completed.

OBJECT_ID OBJECT_NAME
---------- ------------------------------
       100 ORA$BASE
       116 DUAL

Буферизируйте результат запроса в файл и загружайте его в целевую базу данных.

0 голосов
/ 06 марта 2012

Похоже, что вариант будет загрузить набор идентификаторов в источник. Это звучит потенциально раздражающе, что приходится делать регулярно. Можете ли вы поставить приложение Apex на источник?

В наши дни существуют стандартные функции приложения, которые позволяют вам настроить приложение для декларативной загрузки csv, содержащего идентификаторы (или вы можете использовать опцию загрузки данных из интерфейса apex), а затем, конечно, apex может сообщить о необходимых строки, и вы можете загрузить их как csv ... Я не думаю, что 10 000 строк должны вызывать какие-либо проблемы с этой техникой)

Apex должен сделать это довольно быстро и просто!

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