我有两个独立的,未连接且不可连接的Oracle数据库。我需要尽可能快速,轻松地从一个到另一个获取信息。
通常我在此情况下所做的就是为需要导入的数据创建一个临时区域(本质上是一个临时表,用于存储数据,直到我完成合并)。我将可能所需的所有数据从源复制到该暂存区域。然后,如果两个表连接的话,我会合并数据,这意味着当然我可以过滤掉那时我不需要的任何数据。
这是我目前的问题。源表极大且完全未索引(我无法控制的东西,呃)。这意味着如果我不以某种方式过滤它,需要永远来获取必要的数据。此外,目标表实际上只需要一个相对较小的数据子集来完成它需要做的事情,一次可能有一万个左右不同的行。在这种情况下,我不想复制可能所需的所有数据。我只想复制所需的完全数据,或尽可能接近。
tl:dr version
如果他们无法相互通信,我如何根据目标表中的需要限制源表上的选择?
例如,我可能会为目标中所需的数据选择ID,并基于此构建源表的查询。但是,这可能会导致查询中包含数千个OR子句:
SELECT x, y FROM z WHERE (ID = 1 OR ID = 2 ... OR ID = 10000 OR ID = 10001...)
或类似的东西。有没有更好的方法呢?
答案 0 :(得分:3)
您可以在两个oracle数据库之间临时创建dblink吗?这将使您能够构建一个引用两个不同数据库中的表的SQL语句。
答案 1 :(得分:1)
是否存在防火墙或阻止数据库实例通信的内容? 如果是这样,您可以始终从源中提取到制表符分隔的数据集,然后从中加载到目标中。选择看起来像
SELECT x, y FROM z WHERE ID IN (1, 2, ..., 10000, 10001, ...)
如果列表中的项目太多,您可以将列表中的项目放在临时表中并加入其中。或者按照Tom Kyte的例子: http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:210612357425 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, ...))
答案 2 :(得分:0)
听起来似乎是将一组id加载到源中。这听起来很烦人,必须经常做。你能在源头上放一个顶点应用程序吗?
现在有一些标准的应用程序功能,允许您设置一个应用程序来声明性地加载包含ID的csv(或者你从apex接口中选择kuse theload data选项),然后当然apex可以报告所需的行,你可以下载它们作为csv ...我不认为10000行应该给你这个技术的任何问题)
Apex应该能够让这个变得非常快速和简单!
答案 3 :(得分:0)
您可以使用dbms_output将数据导入源数据库中。 然后在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
将查询结果假冒成文件并将其加载到目标数据库中。