我有两个数据库,我将它们称为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登台表中,然后将该表与目标分区交换。
答案 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;