database - 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,第一个循环会抛出错误,并且我没有得到任何输出。
解决方案
SQL PL 一次只能连接到一个数据库——这就是设计。
在您的脚本示例中,第二个连接将首先关闭任何当前连接。
联合使您可以像访问本地表一样访问远程表。
如果您无法使用 federation ,您的选项包括:
在本地实现远程表并复制数据(这可以通过从远程游标加载来完成)。然后,您可以使用 SQL 来比较行,因为这两个表都在同一个数据库中。这只有在您有足够的容量来容纳同一数据库中的两个表时才可行,尽管压缩在这里会有所帮助。
不使用 SQL 而是使用其他工具 例如:根据数据量和数据类型,您可以将源/目标表导出到平面文件并比较文件(差异等)。您还可以导出到管道并在内存比较中使用。或者,您可以使用 python 或 perl 或任何脚本语言,并在内存中分块进行比较(在所有情况下,每个线程一次只能连接到单个数据库)。
使用第三方工具进行数据比较。
如果您使用嵌入式 SQL,则 type-2 连接提供了另一种可能性。
推荐阅读
- c# - 在 Swagger 中记录多种可能的返回类型
- python - 行尾字符的测试参数
- python - 在 PyQT 中,为什么某些小部件在调用它们之前需要“self”参数,而其他小部件则不需要
- python - 将字符串月日、年转换为 mm/dd/yyyy
- c# - 为什么我的服务器 TcpListener 使用本地地址而不使用公共地址?- 例外:请求的地址在其上下文中无效
- javascript - 需要一种使用字符串上的键来识别特定变量类型的方法
- javascript - 学生,老师一个普通的模型还是猫鼬中的两个单独的模型?
- java - SpringBoot + Postman @RequestMapping value = "getImage/{imageName:.+}"
- cassandra - Cassandra 无法将列覆盖为旧值
- java - 如何以编程方式折叠primefaces手风琴面板中的所有面板?