首页 > 解决方案 > DB2 - 在 SQL PL 中查询两个数据库

问题描述

我需要比较两个不同 DB2 数据库实例的数据。我们不允许建立联邦。我找到了说明如何指定从远程数据库加载数据的参考资料,以及有关如何指定数据库连接的参考资料,包括数据库名称、用户名等。理想情况下,我可以对一个数据库执行查询,然后将其与第二个数据库可以是一对一的(使用 SQL PL 循环等),也可以是单个大型连接。我已经到了 SQL PL 脚本可以依次连接到每一个的地步(它提示我输入两者的密码),但是当我尝试查询表时它只识别第二个。

我们尝试过的:在开头添加两个不同的 CONNECT 语句。

声明一个游标并指定数据库名称(这似乎只在从一个数据库加载到另一个数据库时才有效,我们试图避免这种情况)。

set serveroutput on@
set sqlcompat DB2@
connect to first user myname@
connect to second user myname@

-- run command: db2 -td@ -vf test3.sql
begin

    declare loop_counter int;
    call dbms_output.enable(100000);
    set loop_counter = 0;

FIRSTLOOP: for o as ord1 cursor for 
        select field1, field2 from first.firstschema.firsttable fetch first 10 rows only with ur
    do
        set loop_counter = loop_counter + 1;
        call dbms_output.put_line('Field: '||field1||', other '||field2);
    end for;
    call dbms_output.put_line('End first program: ');
SECONDLOOP: for p as ord2 cursor for 
        select field1, field2 from second.secondschema.secondtable fetch first 10 rows only with ur
    do
        set loop_counter = loop_counter + 1;
        call dbms_output.put_line('Field: '||field1||', other '||field2);
    end for;
    call dbms_output.put_line('After second call');
end@

理想情况下,两个游标循环中的每一个都将打印 10 行。实际上,无论哪个 CONNECT 第二个完成都是有效的。例如,如果我先连接到 SECOND,然后再连接到 FIRST,则第一个循环有效,第二个循环显示“..... 是一个未定义的名称”。如果我先连接到 FIRST,然后再连接到 SECOND,第一个循环会抛出错误,并且我没有得到任何输出。

标签: databasedb2multiple-instances

解决方案


SQL PL 一次只能连接到一个数据库——这就是设计。

在您的脚本示例中,第二个连接将首先关闭任何当前连接。

联合使您可以像访问本地表一样访问远程表。

如果您无法使用 federation ,您的选项包括:

  • 在本地实现远程表并复制数据(这可以通过从远程游标加载来完成)。然后,您可以使用 SQL 来比较行,因为这两个表都在同一个数据库中。这只有在您有足够的容量来容纳同一数据库中的两个表时才可行,尽管压缩在这里会有所帮助。

  • 不使用 SQL 而是使用其他工具 例如:根据数据量和数据类型,您可以将源/目标表导出到平面文件并比较文件(差异等)。您还可以导出到管道并在内存比较中使用。或者,您可以使用 python 或 perl 或任何脚本语言,并在内存中分块进行比较(在所有情况下,每个线程一次只能连接到单个数据库)。

  • 使用第三方工具进行数据比较。

  • 如果您使用嵌入式 SQL,则 type-2 连接提供了另一种可能性。


推荐阅读