Oracle 克服数据库链接上大容量插入的限制

Oracle 克服数据库链接上大容量插入的限制,oracle,plsql,oracle11g,oracle9i,Oracle,Plsql,Oracle11g,Oracle9i,似乎有一个实现限制,禁止对所有..使用。。通过数据库链接使用时,在Oracle上插入。这是一个简单的示例来演示: connect schema/password@db1 create table tmp_ben_test ( a number , b number , c date , constraint pk_tmp_ben_test primary key (a, b) ); Table created. connect schema/password@db2 C

似乎有一个实现限制,禁止对所有..使用
。。通过数据库链接使用时,在Oracle上插入
。这是一个简单的示例来演示:

connect schema/password@db1

create table tmp_ben_test (
   a number
 , b number
 , c date
 , constraint pk_tmp_ben_test primary key (a, b)
    );

Table created.

connect schema/password@db2
Connected.

declare

   type r_test is record ( a number, b number, c date);
   type t__test is table of r_test index by binary_integer;
   t_test t__test;

   cursor c_test is
    select 1, level, sysdate
      from dual
   connect by level <= 10
           ;

begin

   open c_test;
   fetch c_test bulk collect into t_test;

   forall i in t_test.first .. t_test.last
     insert into tmp_ben_test@db1
     values t_test(i)
            ;

   close c_test;

end;
/
但是,如果可能的话,我宁愿只插入一次。将数据插入GTT,然后再通过DB链接,对于已经是用户定义类型的数据集来说,这似乎是一个巨大的过度杀戮

只是想澄清一下,与实际发生的情况相比,这个例子是极其简单的。我们不可能在中插入一个简单的
,也不可能在GTT上完成所有操作。大部分代码必须以用户定义的类型完成


是否有其他更简单或更简单的方法来绕过此限制?

您在远程数据库上面临哪些限制?如果您可以在那里创建对象,那么您就有了一个解决方法:在远程数据库上创建集合类型和一个过程,该过程将集合作为参数并执行FORALL语句。

如果您在db2中创建t\u test/r\u test类型,然后在db1上为它们创建一个公共同义词,那么您应该能够从db1到db2填充t_表并返回到db1。然后您应该能够插入到本地表中

我假设您将在现实世界中使用打包类型和过程,而不是匿名块


而且,对于大数据集来说,它不是理想的解决方案,那么GTT或类似的解决方案会更好。

您尝试过GTT ideea吗?比较11g中的性能。我想这不是一种过分的做法,而是一种快速的约会方式。不,我没有试过。如果没有其他选择,我当然会的。从记忆中提取一些东西似乎很奇怪;将它移到另一个内存中,然后执行一些DML。我希望有一个更简单的解决方案。如果有,想一想。GTT部分是纯SQL的,速度很快(带有dblink惩罚)。慢的是带有数组的ps/sql部分…我在任何地方都没有限制;这些只是处理DBs,没有连接到外部世界。我花了几秒钟才明白你的意思;在db2中的
db1
上执行一个过程,该过程将一个类型作为参数,并为我进行插入?
for i in t_test.first .. t_test.last loop
    insert into tmp_ben_test@db1
    values t_test(i);
end loop;