Прямая вставка пути через ссылку в БД - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть две базы данных, которые я назову LOCAL и REMOTE.Я понимаю и подтвердил, что выполнение следующего из LOCAL не приведет к прямой вставке пути:

INSERT /*+ APPEND */ INTO REMOTE_TABLE@REMOTEDB
SELECT * FROM LOCAL_TABLE;

, но выполнение следующего из REMOTE приведет к прямой вставке пути:

INSERT /*+ APPEND */ INTO REMOTE_TABLE
SELECT * FROM LOCAL_TABLE@LOCALDB;

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

CREATE OR REPLACE PROCEDURE MY_LOAD AS
BEGIN
  INSERT /*+ APPEND */ INTO REMOTE_TABLE
  SELECT * FROM LOCAL_TABLE@LOCALDB;
END;

И я запустил процедуру из локальной базы данных:

BEGIN
  MY_LOAD@REMOTEDB;
END;

Но она не выполняет прямую вставку пути.

Может кто-нибудь подтвердить, что да, это не будет делать прямой путь вставки?Может кто-нибудь предложить альтернативный способ сделать прямой путь вставки?

Требования большого изображения - копировать все или подмножество строк из раздела в локальной базе данных в раздел в удаленной базе данных.Таблица назначения находится в режиме LOGGING, поэтому планируется направить загрузку INSERT в промежуточную таблицу NOLOGGING в базе данных REMOTE, а затем поменять эту таблицу с разделом назначения.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018
CREATE OR REPLACE PROCEDURE MY_LOAD
AS
BEGIN
  INSERT /*+ APPEND */
  INTO REMOTE_TABLE
    (COLUM1,COULMN2
    )
  SELECT COLUMN1,COULMN2 FROM LOCAL_TABLE@LOCALDB;
END;
---OR---------
CREATE OR REPLACE PROCEDURE MY_LOAD
AS
TYPE T_BULK_COLLECT
IS
  TABLE OF REMOTE_TABLE%ROWTYPE;
  L_BULK T_BULK_COLLECT;
  CURSOR C1
  IS
    SELECT * FROM LOCAL_TABLE@LOCALDB;
BEGIN
  OPEN C1;
  LOOP
    FETCH C1 BULK COLLECT INTO L_BULK LIMIT 1000;
    FORALL I IN 1 .. L_BULK.COUNT
    INSERT INTO REMOTE_TABLE VALUES L_BULK;
    (I );
    EXIT
  WHEN C1%NOTFOUND;
  END LOOP;
  CLOSE C1;
END;
0 голосов
/ 23 ноября 2018

Вы имеете в виду INSERT прямого пути , эта функция имеет ряд ограничений, одним из которых является

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

, который точно описывает ваше наблюдение.Вам нужно будет инициировать транзакцию из подключения к удаленному сайту, поэтому вы будете указывать путь INSERT в локальной таблице, получая данные по ссылке в БД.

Ваш подход с удаленным вызовом процедуры не работает, так как это открывает распределенные транзакции.

...