通过数据库链接直接插入路径

时间:2018-11-22 20:56:06

标签: sql oracle insert append dblink

我有两个数据库,我将它们称为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;

但是它不会直接插入路径。

任何人都可以确认是的,这不会执行直接路径插入吗?谁能提供另一种直接插入路径的方法?

重要的要求是将全部或部分行的副本从LOCAL数据库中的分区复制到REMOTE数据库中的分区。目标表处于LOGGING模式,因此计划是将INSERT加载到REMOTE数据库上的NOLOGGING登台表中,然后将该表与目标分区交换。

2 个答案:

答案 0 :(得分:0)

您的意思是Direct-Path INSERT,此功能有很多限制,其中之一是

  

包含直接路径INSERT语句的事务无法或变得分布式。

准确描述您的观察结果。您必须从连接到REMOTE站点的连接启动事务,因此您将在本地表中直接引导路径INSERT,以通过DB链接获取数据。

您的远程过程调用方法无效,因为这会打开分布式事务。

答案 1 :(得分:0)

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;