2015-11-27 20 views
0

我有两个数据库具有相同的模式, 我需要使用Oracle中的DATABASE LINK从具有相同模式(相同名称,相同列)的两个表中选择数据?使用Oracle中的DATABASE LINK从两个具有相同模式的表中选择数据?

SQL> select * from TEST1; 

     ID NAME 
---------- ---------- 
     2 Two 
     4 Foor 

SQL> select * from [email protected]; 

     ID NAME 
---------- ---------- 
     1 One 
     3 Three 

SQL> select * from TEST1, [email protected]; 
select * from TEST1, [email protected] 
     * 
ERROR at line 1: 
ORA-00918: column ambiguously defined 

我希望得到以下结果:

 ID NAME 
---------- ---------- 
     2 Two 
     4 Foor 
     1 One 
     3 Three 

问候,

回答

3

使用UNION ALL操作

select * from TEST1 
UNION ALL 
select * from [email protected]; 

编辑:

新增FUNC草案:

CREATE OR REPLACE TYPE site IS OBJECT (id NUMBER, name VARCHAR2(255)); 
/

CREATE OR REPLACE TYPE site_collection IS TABLE OF site; 
/

CREATE OR REPLACE FUNCTION merge_sites (sites SYS.ODCIVARCHAR2LIST) RETURN site_collection PIPELINED 
IS 
    commandText VARCHAR2(4000); 
    c SYS_REFCURSOR; 
    sid test.id%type; 
    sname test.name%type; 
BEGIN 
    FOR i IN 1..sites.COUNT LOOP 
     commandText := 'SELECT id, name FROM ' || sites(i); 
     OPEN c FOR commandText; 

     LOOP 
      FETCH c INTO sid, sname; 
      EXIT WHEN c%NOTFOUND;   
      PIPE ROW (site(sid, sname)); 
     END LOOP; 
    END LOOP; 
END; 
/

SELECT * FROM TABLE(merge_sites(sys.ODCIVARCHAR2LIST('test1', '[email protected]'))); 

您需要确保类型和表之间的数据类型匹配。

+0

是否有另一种解决方案比使用* UNION ALL *。因为我们不能将N union用于N个站点。 – Boubakr

+0

“UNION ALL”有什么问题?其他任何事情都会更加复杂。这个操作符完全符合目的,将两个行源连接成一个。 – Husqvik

+0

假设我们有100个站点,每个站点都有相同的模式(我要求的情况相同),我应该写100个select查询,并使用* UNION ALL *? – Boubakr

相关问题