微波EDA网,见证研发工程师的成长!
首页 > 通信和网络 > 通信网络技术文库 > DB2下数据转移任务操作实例

DB2下数据转移任务操作实例

时间:03-25 来源:51CTO 点击:
别名

别名是源数据库中的远程表的本地别名。指定了别名,就可以在目标数据库中用 SQL 语句查询远程表,就像查询任何本地表一样。

清单 14. 创建联邦访问所需的数据库对象



注意:这里描述的设置联邦访问所需的步骤完全独立于 LOAD FROM CURSOR 功能。这意味着这些是为远程数据库中的表创建别名的通用步骤。

配置了对源数据库表的联邦访问之后,就可以像前面一样执行 LOAD FROM CURSOR 操作。首先,定义一个游标,它使用上面创建的别名读取远程表中的所有行。然后,在 LOAD 命令中引用这个游标。

清单 15. 使用别名执行远程 LOAD FROM CURSOR 操作



正如前面提到的,与方法 2 相比,结合使用 LOAD FROM CURSOR 操作和联邦访问需要做的配置工作比较多。但是,联邦访问的主要优点是可以从非 DB2 数据源装载数据。通过使用联邦方式,可以访问 Oracle、SQL Server 等数据源以及其他许多关系和非关系数据源,通过创建别名并执行引用别名的 LOAD FROM CURSOR 操作来复制内容。WebSphere Federation Server 产品提供访问非 DB2 数据源所需的包装器。


方法2 使用 LOAD FROM CURSOR 命令的远程访问特性

既然已经了解了使用别名的远程 LOAD FROM CURSOR 操作方法,现在看看另一种比较简便的方法。为此,首先删除刚才在目标数据库 MYSAMPLE 中的 SALES 表中导入的所有行,见清单 16。

清单 16. 删除目标表中的所有行,以便再次执行 LOAD FROM CURSOR 操作



对于第二种方法,不需要配置对远程数据库的联邦访问。只需使用 DATABASE 选项在 DECLARE CURSOR 语句中指定远程数据库。为此,要在本地 DB2 实例的系统数据库目录中对远程数据库进行编目。前面已经给出了所需的 CATALOG 命令。另外,在定义游标时要指定远程访问所需的用户名和密码。LOAD 命令本身保持不变。

清单 17. 在不使用别名的情况下执行远程 LOAD FROM CURSOR 操作



从 DB2 9.1 开始,可以以这种方式执行远程 LOAD FROM CURSOR 操作,这种方式基于 DB2 8 中的联邦访问方法。这种新方法有两个优点 -- 容易使用且性能好。显然,新方法非常容易使用。性能比联邦方法好是因为涉及的数据传输层更少。但是,不应该忘记联邦方法的优点,即可以访问非 DB2 数据源。

CLP 和 ADMIN_CMD 在 LOAD FROM CURSOR 方面的差异

可以通过特殊的存储过程 ADMIN_CMD 执行许多管理命令,从而把管理命令嵌入在应用程序代码中。这也适用于 LOAD FROM CURSOR 操作。存储过程 ADMIN_CMD 的使用与应用程序代码的位置无关,也就是说,在客户端代码(例如 Java 应用程序)和服务器端代码(例如 SQL/PL 存储过程)中都可以使用它。下面的示例在一个定制的 SQL/PL 存储过程中使用 ADMIN_CMD 存储过程。create_load_routine.sql 文件包含示例存储过程 REMOTE_LOAD_FROM_CURSOR 的 SQL/PL 源代码。

清单 18. 包含示例存储过程的 create_load_routine.sql 文件



存储过程中的第一个语句是 DELETE,它删除本地目标表 SALES 中现有的行。接下来,用适当的 LOAD 命令调用 ADMIN_CMD,从而执行远程 LOAD FROM CURSOR 操作。这种方式与从命令行执行 LOAD FROM CURSOR 操作的差异如下:

不需要通过执行 DECLARE CURSOR 单独定义所需的游标。在 LOAD 命令中提供相应的 SELECT 语句,就会隐式地定义游标。只有在 ADMIN_CMD 调用中嵌入 LOAD FROM CURSOR 操作的情况下,这种语法才是有效的,在命令行上是无效的。

在 LOAD 命令中通过 DATABASE 选项定义远程数据库。不可能指定远程访问所需的用户名/密码组合。请在测试存储过程时观察这一限制的影响。

但是,首先应该在目标数据库 MYSAMPLE 中创建存储过程。

清单 19. 创建示例存储过程



第一个测试调用失败,返回消息 SQL30082N Security processing failed with reason "3" ("PASSWORD MISSING"). SQLSTATE=08001。

清单 20. 对示例存储过程的第一次测试失败



这个错误消息是由于建立数据库连接的方式造成的:db2 "CONNECT TO

MYSAMPLE"。在执行 CONNECT 语句时,没有提供用户名和密码,因此使用登录操作系统所用的用户名建立连接。在这种情况下,DB2 不知道此用户的密码。在存储过程中执行 LOAD FROM CURSOR 操作时,DB2 尝试用本地用户的授权 ID 连接远程数据库 SAMPLE。但是,由于使用隐式的 CONNECT,DB2 不知道相应的密码,所以远程访问失败。因此,这个错误的原因如下:

因为通过 ADMIN_CMD 执行的 LOAD FROM CURSOR 操作不允许指定远程访问所用的用户,所以 LOAD 操作自动地用属于本地数据库连接的授权 ID 连接远程数据库。

如果本地连接的用户执行隐式的 CONNECT 而没有指定密码,DB2 就不知道他/她的密码,因此在尝试连接远程数据库时没有密码可用。

通过 ADMIN_CMD 执行的远程 LOAD FROM CURSOR 操作的这一特点(无法指定远程访问所用的用户)还有一个影响:当前连接本地数据库的用户必须用相同的授权 ID 访问远程数据库。在使用联邦方法访问远程数据库时,没有这一限制,因为必须以用户映射的形式定义额外的抽象层。

既然找到了错误的原因,就可以重新连接本地数据库,这一次显式地指定用户名和密码。对存储过程的第二次调用应该会成功 (Return Status = 0),见清单 21。

清单 21. 对示例存储过程的第二次测试成功



Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top