Database 在两个独立的Oracle数据库之间合并数据

Database 在两个独立的Oracle数据库之间合并数据,database,oracle,Database,Oracle,我有两个独立的、未连接的和不可连接的Oracle数据库。我需要尽可能快速、无痛地从一个地方到另一个地方获取信息 通常,在这种情况下,我到目前为止所做的是为需要导入的数据创建一个暂存区(基本上是一个临时表,仅用于在合并完成之前存储数据)。我将可能需要的所有数据从源复制到临时区域。然后我合并数据,就像两个表连接一样,这当然意味着我可以过滤掉当时不需要的任何数据 这就是我目前的问题所在。源表非常大,而且完全没有索引(这是我无法控制的,呃)。这意味着,如果我不以某种方式对数据进行过滤,则需要永远才能获得

我有两个独立的、未连接的和不可连接的Oracle数据库。我需要尽可能快速、无痛地从一个地方到另一个地方获取信息

通常,在这种情况下,我到目前为止所做的是为需要导入的数据创建一个暂存区(基本上是一个临时表,仅用于在合并完成之前存储数据)。我将可能需要的所有数据从源复制到临时区域。然后我合并数据,就像两个表连接一样,这当然意味着我可以过滤掉当时不需要的任何数据

这就是我目前的问题所在。源表非常大,而且完全没有索引(这是我无法控制的,呃)。这意味着,如果我不以某种方式对数据进行过滤,则需要永远才能获得必要的数据。此外,目标表实际上只需要相对较小的数据子集来完成它需要做的事情,一次可能需要一万行左右的不同行。在这种情况下,我不想复制可能需要的所有数据。我只想复制所需的确切数据,或者尽可能接近这些数据

tl:dr版本

如果源表与目标表之间无法通信,如何根据目标表中的需要限制对源表的选择?

例如,我可以为目标中所需的数据选择ID,并基于该ID为源表构建查询。但是,这可能会导致查询中包含数千个OR子句:

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

或者类似的。有更好的方法吗?

能否在两个oracle数据库之间临时创建一个dblink?这将使您能够构建引用两个不同数据库中的表的SQL语句。

您可以临时在两个oracle数据库之间创建dblink吗?这将使您能够构建引用两个不同数据库中的表的SQL语句。

是否有防火墙或阻止DB实例通信的东西?
如果是这样,您总是可以从源中提取到以制表符分隔的数据集,然后从该数据集加载到目标中。select可能看起来像

SELECT x, y FROM z WHERE ID IN (1, 2, ..., 10000, 10001, ...)
如果列表中的项目太多,可以将列表中的项目放入临时表中并加入该表。或者以Tom Kyte为例: 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, ...))

是否有防火墙或其他东西阻止DB实例通信?
如果是这样,您总是可以从源中提取到以制表符分隔的数据集,然后从该数据集加载到目标中。select可能看起来像

SELECT x, y FROM z WHERE ID IN (1, 2, ..., 10000, 10001, ...)
如果列表中的项目太多,可以将列表中的项目放入临时表中并加入该表。或者以Tom Kyte为例: 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, ...))

这听起来像是一个选项,将ID集加载到源代码中。这听起来可能很烦人,因为你必须经常这样做。你能在源代码上放一个apex应用程序吗

现在有一些标准的应用程序功能,允许您设置一个应用程序,以声明方式加载包含ID的csv(或者您可以从apex接口中选择加载数据选项),当然,apex可以报告所需的行,您可以将它们作为csv下载……我认为10000行不会给您带来任何问题)


Apex应该能够使这变得非常快速和简单

这听起来像是一个选项,将ID集加载到源代码中。这听起来可能很烦人,因为你必须经常这样做。你能在源代码上放一个apex应用程序吗

现在有一些标准的应用程序功能,允许您设置一个应用程序,以声明方式加载包含ID的csv(或者您可以从apex接口中选择加载数据选项),当然,apex可以报告所需的行,您可以将它们作为csv下载……我认为10000行不会给您带来任何问题)


Apex应该能够使这变得非常快速和简单

您可以使用dbms_输出将数据输入到源数据库中的数组中。 然后在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

将查询结果假脱机到一个文件中,并将其加载到目标数据库中。

您可以使用dbms\u输出将数据输入到源数据库中的数组中。 然后在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

将查询结果假脱机到一个文件中,并将其加载到目标数据库中。

即使这两个数据库无法相互通信,您能否定位一个客户端,使其能够同时与这两个数据库通信?您如何知道您需要什么,这只是自某个日期以来的新行,或者更微妙的事情?它是自某个日期以来添加的外键的一组不同ID。因此,最初的选择类似于“从TABLEX中选择不同的外键ID,其中添加了日期>'2012-01-01'”;即使这两个数据库无法相互通信,您能否定位一个客户端,使其能够同时与这两个数据库通信?您如何知道您需要什么,这只是自某个日期以来的新行,或者更微妙的事情?它是自某个日期以来添加的外键的一组不同ID。因此,最初的选择类似于“从TABLEX中选择不同的外键ID,其中DATE添加了>'2012-01-01'”;“我不是他们中任何一个的实际DBA,我几乎只限于选择源上的权限以及选择、插入、更新和删除目标上的权限。除非