【问题标题】:Select data from two tables having same schema using DATABASE LINK in Oracle?使用 Oracle 中的 DATABASE LINK 从具有相同架构的两个表中选择数据?
【发布时间】:2015-11-27 21:29:09
【问题描述】:

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

SQL> select * from TEST1;

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

SQL> select * from TEST1@link22;

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

SQL> select * from TEST1, TEST1@link22;
select * from TEST1, TEST1@link22
       *
ERROR at line 1:
ORA-00918: column ambiguously defined

我想得到以下结果:

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

问候,

【问题讨论】:

    标签: oracle dblink


    【解决方案1】:

    使用UNION ALL 运算符

    select * from TEST1
    UNION ALL
    select * from TEST1@link22;
    

    编辑:

    新增功能草案:

    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', 'TEST1@link22')));
    

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

    【讨论】:

    • 除了使用 UNION ALL 之外,还有其他解决方案吗?因为我们不能对 N 个站点使用 N 个联合。
    • UNION ALL 有什么问题?其他任何事情都会更复杂。此运算符完全符合目的,将两个行源连接为一个。
    • 假设我们有 100 个站点,每个站点都有相同的架构(我要求的情况相同),我应该编写 100 个选择查询,并使用 UNION ALL 吗?跨度>
    • 如果您想在一个输出中包含所有站点的所有行,可以。如果您在某处有站点列表,或者随着时间的推移添加/删除了站点,您可以使用 PL/SQL 构建动态 SQL 并将其隐藏在 PIPELINED 函数后面。
    • @BoubakrNOUR - 你为什么要尝试编写一个查询来从 100 个不同的数据库中读取数据?流水线表功能大部分都可以工作,但效率不会很高,如果 100 个数据库中有 1 个出现故障或无法访问,它就会死掉。听起来您真的想在实例之间实现真正的多主复制,而不是手动编码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2020-01-03
    • 2018-10-20
    • 2018-07-09
    • 2019-08-03
    相关资源
    最近更新 更多