IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Information Management  >

通过 WebSphere Federation Server 实现 Excel 和关系型数据库的整合

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

肖 振春 (xiaozc@cn.ibm.com), 软件工程师,IBM 中国软件开发中心,IBM, IBM

2007 年 7 月 11 日

本文将介绍通过 WebSphere Federation Server 以及相关的复制技术来实现 Excel 和关系型数据库的整合和集成,同时也对目前存在的一些局限性做了相关分析和相应的解决办法。

Excel是当前国内中小企业中比较普及的一种数据存储方式,随着中小企业的发展壮大,它们迫切需要将原先的Excel数据文件内容导入到关系型数据库这样更高级的一种数据系统中,或者通过某种方式将其Excel数据和数据库系统整合。本文主要介绍通过WebSphere Federation Server(曾经名为WebSphere Information Integrator,简称为WSII)技术以及相关的复制技术来实现Excel和关系型数据库的整合和集成,同时也对目前存在的一些局限性做了相关分析和相应的解决办法。

一.原理

联合数据库系统(Federation system和Websphere Information Integrator的概称)是一种特殊的分布式数据管理系统,由一个作为联合服务器的DB2实例、一个充当联合数据库的数据库、一个或多个数据源以及访问数据源的客户机组成。联合数据库可以将一个SQL语句中的分布式请求发送给多个数据源,并连接返回的结果,就好像访问的数据源都在本地一样。

联合数据库系统使用包装器的机制与数据源进行交互。包装器是由包装器模块库中的一些实现例如连接数据源,从数据库检索数据的例程组合而成的。可以用CREATE WRAPER语句来为数据源创建包装器。例如,Excel数据源通过ODBC包装器和联合数据库系统服务器进行交互,如下图所示:


图 1. 数据源,包装器和联合服务器之间的关系
图 1. 数据源,包装器和联合服务器之间的关系

包装器封装了各种数据源的特征,可以利用这些特征将数据源注册到联合数据库系统中。同时,包装器用于维护联合数据库和数据源之间的连接。以及访问数据源,包括对数据源进行查询,修改和更新,对于支持SQL的数据源,直接提交SQL,对于不支持SQL的数据源,将SQL语句转化成数据源自身查询语言或者数据源调用API。包装器还可以将远程查询结果的数据映射为联邦引擎所要求的表格式。

DB2 Information Integrator为按照数据源的类型,分为两种类型的包装器:

1) 关系型包装器(relational wrapper): 支持Oracle, DB2 UDB, MS SQL, Sybase, Informix, ODBC, OLE DB等关系型数据源。

2) 非关系型包装器(non-relational wrapper):支持Excel, XML等非关系型数据源。

我们以Excel为例,说明在联合数据库系统中,如何注册非关系型数据源,以及如何实现非关系型数据源与DB2等关系型数据库的整合和集成。





回页首


二.注册Excel数据源

我们将Excel数据表格的注册到联合数据库系统分为八个步骤,分别为初始环境的配置、联合数据库的创建、对实例参数进行配置、注册包装器、定义服务器、创建用户映射、创建昵称、测试与查看,如下图所示。其中,数据源注册的核心步骤为:注册包装器、定义服务器、创建用户映射和创建昵称。


图 2. 核心步骤
核心步骤

1.初始环境配置

确认本地计算机已经安装了:DB2 ESE,DB2 RCON, DB2 LSDC (DB2 information integrator for relational data source and non-relational data source),MS Excel。

2.创建联合数据库

1.联合数据库的创建是通过DB2控制中心完成的。单击开始,选择程序中的IBM DB2,选择一般信息工具,打开控制中心(CC),在所有数据库上单击后键,选择创建数据库,选择"标准",即弹出数据库创建向导。


图 3. 数据库创建向导
数据库创建向导

2.为数据库命名(本例中命名为PRODUCT), 因为本例中创建的这个数据库只是用来充当联合数据库,和非关系型数据源Excel进行连接,所以采用数据库的默认配置即可。


图 4. 数据库命名
数据库命名

3.数据库的创建过程,如下图所示:


图 5. 数据库的创建
数据库的创建

注:创建数据库对应的SQL语句(CREATE DATABASE)如下所示,可以是直接在命令行窗口下用此SQL语句直接完成数据库PRODUCT的创建:

CREATE DATABASE PRODUCT ON 'c:' USING CODESET GBK TERRITORY CN COLLATE USING SYSTEM;

3.对实例参数进行配置

实例参数Federated是用来控制是DB2的对联合数据库的支持的。创建数据库时,其默认值为"否",即系统默认关闭了对联合数据库的支持,不支持关系数据源或非关系数据源的分布式请求。只有将其值修改为'是',才能为数据源建立包装器。

注意:采用这三种方法设置的新的参数值要在重新启动实例后才能生效。

方法一 利用配置助手进行配置

1. 打开控制中心(CC),选择工具选项,选择配置助手,如下图所示:


图 6. 配置助手
配置助手

2. 在配置助手的页面上,单击菜单栏中的配置,选择DBM配置。


图 7. DBM配置
DBM配置

3.系统会弹出DBM配置向导。在参数列表中找到关键字为FEDERATED的参数, 将其值修改为"是"


图 8. FEDERATED 参数
FEDERATED 参数

方法二 使用实例的配置参数选项

1.打开控制中心(CC),打开所有系统,右击联合数据库所属实例(本例中为DB2),选择配置参数选项,如下图所示:


图 9. 配置参数选项
配置参数选项

3. 系统会弹出DBM配置页面,同方法一中第三步,在列表中找到FEDERATED, 并将其值修改为'是'


图 10. 修改 FEDERATED 参数
修改 FEDERATED 参数

方法三 用命令行语句配置参数

1.单击开始,选择程序中的IBM DB2,选择命令行工具,打开命令行窗口,命令行窗口如下图所示:


图 11. 命令行窗口
命令行窗口

2. 在命令行窗口中,运行命令:db2 update dbm cfg using federated yes,如果系统返回如下信息,表示参数已经被正确更新。


图 12. 运行命令
运行命令

4.Excel数据源的注册

向联合数据库系统注册数据源的过程的核心步骤为:注册包装器,定义服务器,创建用户映射,创建昵称。

1.创建包装器

在DB2 Information Integrator中,将包装器分为两类:

  • 关系型包装器(relational wrapper):包括Oracle, Sybase, Informix, ODBC, MySQL等关系型数据源的包装器
  • 非关系型包装器(nonrelational wrapper):包括Excel, XML 等非关系型数据源的包装器。

在创建数据源包装器时,为了访问包装器支持的所有数据源,只需注册一个包装器即可。

2.定义服务器

每个数据源是以服务器的形式注册到联合数据库系统的。

服务器属性代表着每个数据源的特征。通过对数据源参数进行合理的配置,来保证每个数据源的能力得到适当的利用的。通过设置服务器参数可以指定数据源的位置(机器节点)、连接安全信息,类型和版本以及一些影响服务器性能的特征。

3.创建用户映射

用户映射是DB2 Information Integrator提供的一个附件的安全层,主要是将用来访问联合服务器的用户标识和密码和用来访问远程数据源的用户标识和密码之间建立起映射关系,使他们在对数据源的操作上具有相同的权限,这样才可以完成不同数据库之间的安全审核。

DB2准许为一个数据源创建多个用户映射。

4.创建昵称

昵称是联合数据库系统为想要存取每个数据源对象(表和视图等)创建的一个别名。联合数据库系统利用昵称实现了数据源的位置透明性,即对于联合数据库系统的用户来说,昵称所代表的远程对象就像本地DB2表一样.

对于关系型和非关系型数据源,系统在定义昵称时,对列定义和索引信息的获取和维护形式并不相同:

  • 对于关系型数据源,系统可以直接从包装器中获取到列定义和索引信息。
  • 对于非关系型数据源,在创建昵称的时候需要提供相关的列定义和索引信息。

本文中用两种方法将Excel数据源注册到联合数据库系统中:

  • 方法一中,首先利用ODBC驱动,将Excel表格数据文件创建为ODBC数据源,创建ODBC包装器,所以Excel表格作为关系型数据源注册到联合数据库系统中。
  • 方法二中,直接利用Microsoft Excel包装器将Excel表格注册到联合数据库系统中,所以Excel表格作为非关系型数据源注册到联合数据库系统中。

方法一 利用ODBC驱动注册Excel数据源

步骤一 ODBC数据源的建立

1.首先将为Excel表格数据文件配置为ODBC数据源。单击开始,选择控制面板。


图 13. 控制面板
控制面板

打开管理工具,双击打开数据源(ODBC)选项。


图 14. 数据源(ODBC)选项
数据源(ODBC)选项

图 15. 系统DSN选项卡
系统DSN选项卡

2. 选择系统DSN选项卡


图 16. 数据源列表
数据源列表

3.在上图的系统数据源列表中,并没有我们所需要的MS Excel数据源的驱动程序。点击添加 (D) ,向导会显示一个数据源的驱动程序列表。从数据源驱动程序列表中选择Microsoft Excel Driver (*.xls)。


图 17. 选择Microsoft Excel Driver (*.xls)
选择Microsoft Excel Driver (*.xls)

4. 点击完成后,向导会显示如下窗口,用于将具体Excel表格配置为ODBC数据源。为此数据源命名(本例中采用EMBL_RESERACH_1),添加对数据源的描述(可以为空)。


图 18. 将具体Excel表格配置为ODBC数据源
将具体Excel表格配置为ODBC数据源

5.在版本的下拉菜单中,选择所使用的Excel的具体版本(本例中为Excel 97-2000);然后点击"选择工作目录",弹出的界面如下图所示。打开存储作为数据源的Excel表的具体路径,从数据库名的列表中选择要驱动的Excel表(本例中为test.xls),点击确定,完成Excel数据源的ODBC驱动。


图 19. 选择工作目录
选择工作目录

6.正确创建ODBC数据源EMBL_RESEARCH_1后,其将显示在系统数据源的列表中,如下图所示:


图 20. 系统数据源的列表
系统数据源的列表

步骤二 注册ODBC包装器

1.打开控制中心,展开所有数据库,展开所要建立包装器的联合数据库节点(本例中为PRODUCT),并右击"昵称",选择"创建(C)"选项。


图 21. 创建昵称
创建昵称

2.启动创建昵称的向导,该向导帮助创建联合数据库所需的昵称等对象。仔细阅读建立昵称所需创建的联合对象及相关说明,左击下端下一步进入创建包装器页面。


图 22. 创建昵称的向导
创建昵称的向导

3.首先进入包装器创建向导页面,首先,指定想要存取的数据源类型,本方法中是将Excel表以ODBC数据源的形式注册到联合数据库系统中,所以在数据源类型的下拉菜单种选择"ODBC"。


图 23. 包装器创建向导
包装器创建向导

4.左击"创建(C)",则弹出创建包装器向导,系统根据我们先前所选择的数据源类型(ODBC),将自动为包装器查找到对应的包装器模块库(db2rcodbc.dll),此模块库是包装器的核心,包含所有用于完成DB2和ODBC数据源之间交互的例程;为此包装器指定唯一的包装器名(本例中为ODBC), 左击确定,则ODBC数据源的包装器创建完成。


图 24. 包装器创建完成
包装器创建完成

注:1)创建包装器的SQL语句(CREATE WRAPPER)如下所示,我们也可以使用命令行窗口,在连接到PRODUCT数据库(CONNECT TO PRODUCT)的情况下, 运行如下SQL命令,创建的包装器是完全相同。

CREATE WRAPPER ODBC LIBRARY 'db2rcodbc.dll' OPTIONS (ADD DB2_FENCED 'N');

2)在创建包装器的时候,可能发生不能启用数据库实例的错误,具体错误信息如下图所示:


图 25. 错误信息
错误信息

原因:参数Federated未设为"是",操作此数据库的实例的DB2联合支持被关闭,所以,此实例目前无法完成对非关系数据源的分布式请求. 请参考步骤三对参数进行正确设置。

步骤三 定义ODBC数据源服务器

1.成功创建ODBC包装器以后,就可以再在包装器列表中看到ODBC包装器了,选择此包装器,左击"下一步",进入服务器的定义界面。


图 26. 服务器的定义界面
服务器的定义界面

2.左击创建"(C)",则进入服务器创建向导;为ODBC数据源创建对应的服务器,用于将有关数据源服务器的信息提供给联合数据库。


图 27. 服务器创建向导
服务器创建向导

3.左击发现,向导会自动搜索已定义的所有ODBC服务器对象。在服务器定义列表中选择我们刚刚创建的Excel的ODBC服务器(本例中为EMPL_RESEARCH_1)。


图 28. 搜索已定义的所有ODBC服务器对象
搜索已定义的所有ODBC服务器对象

左击右侧的"属性",查看此服务器的具体信息


图 29. 查看此服务器的具体信息
查看此服务器的具体信息

4.选择设置页,在选项列表中找到"Password"选项,"Password"选项的默认值为"Y", 表示每次访问此数据源服务器时,都需要将数据源的认证信息(密码)发送到数据源端进行验证。因为访问Excel表是不需要使用密码的,无需将密码发送到Excel数据源进行验证,所以将此选项的值调整为"N"。


图 30. 设置页
设置页

5.再在选项列表中找到"Pushdown"选项。在联合查询时,如果Pushdown选项设为"N",那么数据源服务器会将表中所有的行全都返回给DB2服务器,由DB2进行查询;如果Pushdown选项设为"Y",那么DB2将把查询的任务"下推"给远程数据源服务器,数据源服务器只将查询的结果返回,这样可以大大减轻了DB2的工作负担,提高DB2的性能。

所以为了充分发挥数据源服务器的性能,将此选项的值设为"Y"。


图 31. Pushdown选项
Pushdown选项

6.完成上述两个服务器参数的配置后,点击确定,完成EMPL_RESEARCH_1服务器的创建。

注:上述数据源服务器的定义SQL语句(CREATE SERVER)如下所示,我们直接在命令行窗口下运行下列语句可以完成相同服务器的定义。

CREATE SERVER EMBL_RESEARCH_1 TYPE ODBC VERSION '3.0' WRAPPER ODBC OPTIONS (ADD NODE 'EMBL_ RESEARCH_1', PUSHDOWN 'y', PASSWORD 'N');

步骤四 创建昵称

1.完成了服务器定义以后,我们就可以在现有服务器列表中,看到已定义好的服务器及其选项信息。在现有服务器定义的列表中选择EMBL_RESEARCH_1服务器,左击下一步,进入创建用户映射的页面。


图 32. 创建用户映射
创建用户映射

2.因为访问Excel的ODBC数据源是不需要用户标识和密码的,所以不需要注册用户映射。没有附加的认证层。再次点击下一步,进入昵称创建页面。


图 33. 用户标识和密码
用户标识和密码

3.对于Excel来说,昵称就是Excel的每个表在DB2联合数据库中所使用的名字。所以,我们需要为每一个要访问的Excel表格创建也对应的昵称。

在创建昵称时,我们推荐直接使用"发现(C)",系统将会自动的查找到所有昵称模式、昵称、远程模式、远程表名之间的对应关系。我们可以通过选定具体的昵称,用"属性"和"模式(S)"来对昵称进行配置。我们也可以利用列表中的创建列,在系统自动发现的所有昵称中选择我们需要创建的。

下面,我们主要介绍一下利用添加方式是如何创建昵称的。点击"添加(A)",则显示添加昵称的向导。


图 34. 利用添加方式创建昵称
利用添加方式创建昵称

4.首先,需要为昵称指定模式,下拉菜单中会显示现有的所有模式,从中选择一个本地模式;然后给出昵称名,可以与远程表名相同,也可不同;因为Excel并没有使用模式,所以不需要填写远程模式,直接填写希望与此昵称相关联的远程表名。点击确定,添加昵称。


图 35. 为昵称指定模式
为昵称指定模式

但是,点击确定后,系统会弹出未定义的名称的错误信息,如下图所示,表示联合服务器在创建昵称的时候并没有找到我们所指定的远程表。


图 36. 错误信息
错误信息

我们在Excel中看到的表名是Sheet1, 如下图所示,但是,如果我们直接在远程表名处填写Sheet1系统就会报错。


图 37. Sheet1 表
Sheet1 表

这是因为所输入的远程表名的格式不正确造成的。正确的远程表名格式是在为远程表名加上后缀$,并用双引号阔起(即本例中正确格式为"Sheet1$"),如下图所示,点击确定,就可以正确的添加昵称了。


图 38. 正确的远程表名格式
正确的远程表名格式

5.当填写完创建昵称所需的必要信息以后,相关的信息将显示在昵称列表中,确认已经在最左侧"创建"列中选中PRODUCT,点击下一步进入总结页面。


图 39. 总结页面
总结页面

6.总结页中列出我们创建的包装器,服务器和昵称的概要信息,核对信息无误后,点击确定,则昵称的创建完成。


图 40. 昵称的创建完成
昵称的创建完成

7.在包装器,服务器定义和昵称全部创建完成的后,操作输出中应显示如下信息表示创建已经成功:


图 41. 操作输出的信息
操作输出的信息

注:创建昵称的SQL语句(CREATE NICKNAME)如下所示,同样的,我们也可以用此SQL语句在命令行窗口完成昵称的创建。

CREATE NICKNAME DENGPAN.PRODUCT FOR EMBL_RESEARCH_1."Sheet1";

步骤五 对ODBC数据源进行测试

正确创建的昵称会显示在昵称列表里,现在我们就可以通过昵称访问Excel数据源中的对应的数据表了(Sheet1)


图 42. 通过昵称访问Excel数据源
通过昵称访问Excel数据源

双击打开昵称,可以看到远程Excel表中的全部数据信息,如下图所示。我们可以通过"添加行(A)","删除行(D)","过滤(F)"操作远程表格。


图 43. 远程Excel表中的信息
远程Excel表中的信息

方法二 利用MS Excel包装器注册Excel数据源

步骤一 注册MS Excel包装器

1.同方法一,打开控制中心,展开所有数据库,展开所要建立包装器的联合数据库节点(本例中为PRODUCT),并右击"昵称",选择"创建(C)"选项。


图 44. 创建昵称
创建昵称

2.同方法一,启动创建昵称的向导,左击下端下一步进入创建包装器页面。


图 45. 创建包装器页面
创建包装器页面

3. 进入包装器创建向导页面,与方法一不同的是,方法一先为Excel表进行ODBC驱动的安装,然后将Excel表以ODBC数据源的形式注册到联合数据库系统中,所以,选择ODBC作为指定存取数据源类型;而本方法中,是直接将Excel表以Microsoft Excel数据源的形式注册到系统中,所以在下拉菜单中选择"Microsoft Excel"即可。


图 46. 直接将Excel表注册到系统中
直接将Excel表注册到系统中

4.同方法一,左击"创建(C)",则弹出创建包装器向导,系统自动查找到对应的包装器模块库(db2lsxls.dll),为此包装器指定唯一的包装器名(本例中为EXCEL), 左击确定,则Microsoft Excel数据源的包装器创建完成。


图 47. 创建包装器向导
创建包装器向导

注:创建包装器的SQL语句(CREATE WRAPPER)如下所示,可直接在DB2命令行窗口下运行如下SQL命令,创建的包装器是完全相同。

CREATE WRAPPER EXCEL LIBRARY 'db2lsxls.dll' OPTIONS (ADD DB2_FENCED 'N');

步骤二 定义MS Excel数据源服务器

1.成功创建Microsoft Excel包装器后,其相关信息会显示在包装器列表中。选择我们刚创建的EXCEL包装器,左击"下一步",进入服务器的定义界面。


图 48. 服务器的定义界面
服务器的定义界面

2.同方法一,点击创建"(C)",进入服务器创建向导;为MS Excel数据源创建对应的服务器。


图 49. 服务器创建向导
服务器创建向导

3.Microsoft Excel数据源服务器的定义相对于ODBC数据源服务器的定义要简单的多。由于访问Excel的简单性,所以没有复杂的配置选项,只需要对服务器进行命名,点击确定,即可完成服务器的创建。


图 50. 完成服务器的创建
完成服务器的创建

注:数据源服务器的定义SQL语句如下所示,我们直接在命令行窗口下运行下列语句可以完成相同服务器的定义。

CREATE SERVER EXCELSERVER WRAPPER EXCEL;

步骤三 创建昵称

1. 完成了服务器定义以后,我们就可以在现有服务器列表中,看到已定义好的服务器及其选项信息。在现有服务器定义的列表中选择EXCELSERVER服务器,左击下一步。


图 51. 创建昵称
创建昵称

2.与方法一不同的是,MS Excel数据源昵称的向导中没有用户映射的配置页。因为Excel本身并没有采用用户名和密码的访问控制机制,并不涉及到与联合数据库系统之间的用户映射,所以不需要对用户映射进行配置,直接进入昵称定义界面。

本方法定义昵称中的"发现(C)"的用途也和方法一中有所不同。此处的"发现(C)"是用来寻找数据源所在的位置,将数据源和包装器连接起来;而方法一中的"发现(C)"是系统自动搜索建立本地昵称及模式与远程昵称与模式之间的映射关系的。

点击"发现(C)",进入下一步。


图 52. 发现
发现

3.在发现向导中找到Excel数据表格所在的位置,选中作为数据源的Excel表(本例中为PRODUCTS.xls)并单击打开。


图 53. 找到Excel数据表格所在的位置
找到Excel数据表格所在的位置

4.系统会为数据源创建默认的本地模式和昵称,即可在昵称列表中看到PRODUCTS昵称的相关配置信息。


图 54. PRODUCTS昵称的相关配置信息
PRODUCTS昵称的相关配置信息

但是,点击确定后,系统会弹出找不到列信息的错误信息,如下图所示,表示联合服务器在创建昵称的时候并不能从MS Excel包装器中获得所需的列信息。

这是因为MS Excel数据源是非关系型数据源,注册的时候需要提供列信息;而方法一中,Excel数据表格以ODBC数据源的形式注册到联合数据库系统中,所以当ODBC包装器确定数据源对象存在以后,包装器昵称注册函数就可以自动从远程系统编目中获取到列的定义,所以就不需要对列信息进行编辑了。


图 55. 错误信息
错误信息

4.选中昵称列表中"PRODUCTS"昵称,点击右侧"属性",则弹出该昵称的属性配置向导。利用此向导,可以对昵称的模式和名称进行重新设置。我们可以看到,此昵称目前并没有包括任何列信息。点击列表右侧的"添加(A)",为当前昵称添加列信息。


图 56. 当前昵称添加列信息
当前昵称添加列信息

5.在添加列向导中,首先为本地昵称中的列进行命名并为此列设置数据类型。对于某些数据类型,系统还可以对其具体信息进行配置。注意,系统是根据所指定的数据类型,自动的搜索数据源中的列,并与所搜索到的第一个匹配的列建立映射关系。并且,可是指定该列是否准许出现空值。点击确定完成昵称中一个列的设置。


图 57. 设置数据类型
设置数据类型

6.完成一个列的创建后,可以在列表中再次核对其相关信息。在确认无误后,点击确定,完成对该昵称属性的修改。


图 58. 核对相关信息
核对相关信息

7.在昵称及昵称中的列全部配置完成后,点击下一步,进入总结页面。


图 59. 总结页面
总结页面

8.再次复查所创建的包装器,服务器定义以及昵称,确认无误后,点击"完成",创建该昵称。


图 60. 再次复查
再次复查

9.在包装器,服务器定义和昵称全部创建完成的后,操作输出中应显示如下信息表示创建已经成功:


图 61. 创建已经成功
创建已经成功

注:创建昵称的SQL语句(CREATE NICKNAME)如下所示,同样的,我们也可以用此SQL语句在命令行窗口完成昵称的创建。

CREATE NICKNAME DENGPAN.TEST (ID INTEGER NOT NULL) FOR SERVER EXCELSERVER OPTIONS (ADD FILE_PATH 'D:\test.xls');

步骤四 对MS Excel数据源进行测试

正确创建的昵称会显示在昵称列表里,现在我们就可以通过昵称访问Excel数据源中的对应的数据列了。


图 62. 昵称列表
昵称列表

双击打开昵称,可以看到远程Excel表数据类型为INTEGER列的信息,如下图所示。我们可以通过"添加行(A)","删除行(D)","过滤(F)"操作远程列。


图 63. 远程Excel表数据类型为INTEGER列的信息
远程Excel表数据类型为INTEGER列的信息




回页首


三 联邦数据库系统的数据复制和整合

1.Excel与DB2之间的数据复制

我们采用两种方法来尝试Excel数据源昵称与DB2数据库之间的复制。

  • 方法一:尝试使用DB2复制中心进行复制。DB2复制中心提供两种数据复制类型: SQL复制和Q复制。SQL复制是利用Capture读取DB2恢复日志获取对指定源表的更改。并将更改保存到分级表中,而Apply并行读取更改并应用于目标事务;Q复制是利用Websphere MQ的队列进行复制。我们采用SQL复制尝试了Excel与DB2之间的复制。但是目前的DB2版本中,并没有提供对类似于Excel的非关系型数据源的支持。所以,我们不能利用复制中心实现从Excel与DB2之间的复制。
  • 方法二:尝试使用命令行语句的方式进行数据复制。我们使用insert into <t1> select from <t2>的命令,完成两个具有相同表结构的Excel Nickname和db2之间的复制。联邦数据库在创建Excel Nickname时,为Excel表中的数据添加了关系型数据表的结构信息,所以我们可以成功地完成从 Excel表到db2中表的复制;但是,Excel表格本身并没有关系型数据表的结构信息,所以从db2表中提取的具有关系型数据表的结构信息的数据不能成功的复制到db2表中。

方法一 利用DB2复制中心

1.单击开始,选择程序中的IBM DB2,选择一般信息工具,打开复制中心(RC),打开SQL复制,在定义列表中的Capture控制服务器上单击后键,选择创建Capture控制表,选择"定制",即弹出Capture控制表创建向导。


图 64. Capture控制表创建向导
Capture控制表创建向导

2.在服务器列表中,选择本例中所创建了Excel数据源昵称的联合数据库PRODUCT。


图 65. 选择联合数据库PRODUCT
选择联合数据库PRODUCT

3.点击确定后,向导会自动获取PRODUCT的Capture控制服务器的信息。


图 66. 自动获取PRODUCT的Capture控制服务器的信息
自动获取PRODUCT的Capture控制服务器的信息

4.选择"使用DB2联合服务器来获取对非DB2服务器的更改",在下拉列表中,选择此联合数据库中包含的非DB2服务器。本例中为上述创建的Excel服务器EXCEL_RESEARCH_1, 所配置的联合服务器是PRODUCT.


图 67. 选择此联合数据库中包含的非DB2服务器
选择此联合数据库中包含的非DB2服务器

5. 首先,指定Capture控制表的模式名(本例中为ASN);然后,选择"非db2控制表"选项卡,需要执行指定远程表对应的模式名。因为Excel本身并没有模式的概念,所以本例中,我们指定创建Excel表的模式名administrator。


图 68. 指定Capture控制表的模式名
指定Capture控制表的模式名

6.但是,点击确定后,系统会弹出复制体系结构级别不支持Excel服务器的错误信息,如下图所示,表示在目前的复制中心的版本中,是不支持以Excel表作为Capture控制表。也就是说,目前,我们不可以用复制中心来完成Excel与数据库之间的复制。因此,目前如果要想通过WSII和DB2 replication来实现Excel和DB2之间的实时复制和实时整合,暂时没有直接的方法。


图 69. 错误信息
错误信息

方法二 利用命令行语句进行复制

1) 从Excel到DB2的复制

1.打开DB2命令行处理器,进入DB2交互方式。用CONNECT语句,连接到联合数据库(本例中为PRODUCT).


图 70. 连接到联合数据库
连接到联合数据库

2. 用LIST TABLES语句获取联合数据库中的表信息。此处可以看到,本例中所创建的Excel数据源昵称以表的形式存储在联合数据库中。


图 71. 获取联合数据库中的表信息
获取联合数据库中的表信息

3.根据昵称的表结构,用CREATE TABLE语句,创建具有相同结构的目标表。 本例中,昵称PRODUCTS$的表结构如下图所示:


图 72. 昵称PRODUCTS$的表结构
昵称PRODUCTS$的表结构

创建具有相同表结构的目标表TARGET, 成功创建后,数据库中的表信息如下图所示:


图 73. 数据库中的表信息
数据库中的表信息

4.利用INSERT语句,将昵称中的信息插入到目标表中。

本例中,我们将PRODUCTS$昵称中所有的数据,都复制到目标表TARGET中。也可以通过不同的SELECT语句参数,选择性的将昵称中的数据插入到目标表中。


图 74. 将昵称中的数据插入到目标表中
将昵称中的数据插入到目标表中

5.对比复制成功后联合数据库昵称中的数据与目标表中的数据,如下图所示:


图 75. 对比昵称中的数据与目标表中的数据(昵称)
对比昵称中的数据与目标表中的数据

图 76. 对比昵称中的数据与目标表中的数据(目标表)
没有图释

注意:本方法虽然可以完成Excel表到DB2表的复制;但是这种复制方法不可以实现数据的实时复制,即当源数据表中发生添加和删除之类的改动的时候,联合数据库系统不能自动地将修改应用于目标数据表中,需手工对目标数据源进行修改。

2) 从DB2到Excel的复制

1.向目标表中添加一条昵称中没有的数据,用于复制。


图 77. 添加一条昵称中没有的数据
添加一条昵称中没有的数据

2. 同样,利用INSERT语句,将DB2表TARGET中的数据复制到Excel数据源昵称PRODUCT$中。但是,从下图中可以看到,这条命令不能被执行,系统自动将事务回滚,也就是说,无法将DB2表中的数据复制到Excel表的昵称中。


图 78. 自动将事务回滚
自动将事务回滚

我们尝试在控制中心,手动将这条数据添加到Excel昵称中,如下图所示:


图 79. 手动添加
手动添加

点击落实(M), 同样不能将数据添加到昵称中,系统将会提示没有为系统对象定义"INSERT"的错误信息。错误信息如下图所示:


图 80. 错误信息
错误信息

再尝试从昵称中删除一条数据,系统同样提示没有为此对象定义"DELETE"。错误信息如下图所示:


图 81. 尝试删除的错误信息
尝试删除的错误信息

综上所述,在目前Websphere Information Integrator的版本中,对于Excel数据源,只提供对昵称的SELETE的操作,不能对昵称进行进行INSERT, DELETE等修改操作。也就是说,目前,我们不能利用包装器,实现从DB2到Excel的复制。

2.Excel与Oracle之间的数据复制

通过Excel和DB2之间数据复制的尝试,我们使用命令行语句的方式来实现Excel到Oracle的数据复制。(本文不详述注册Oracle数据源的详细过程,请参考相应文档)

1. 首先, 对Excel数据源,按照注册数据源中的方法一的步骤建立ODBC包装器;同时,对Oracle数据源,建立名为ORACLE的包装器。本例中,我们使用的是Oracle 10g的数据源,所以选择的包装器类型为Oracle using OCI 8.


图 83. 建立ODBC包装器
建立ODBC包装器

2. 为ODBC包装器,定义服务器PRODUCT(如上文所述);为ORACLE包装器定义服务器ORCL。(可以采用发现的方式来创建ORCL服务器,注意在选择版本时,正确的版本应为10,而不是10g)。


图 84. 为ORACLE包装器定义服务器
为ORACLE包装器定义服务器

3.在PRODUCT服务器上注册昵称PRODUCT$, 同时在ORACLE服务器上创建IPRODUCT昵称(注意:在ORACLE服务器上要首先创建用户映射后才能成功创建昵称)。


图 85. 注册昵称PRODUCT$
注册昵称PRODUCT$

为了成功地实现从Excel与Oracle之间的复制,我们创建的两个昵称应具有相同的表结构。


图 86. 两个昵称应具有相同的表结构(1)
两个昵称应具有相同的表结构

图 87. 两个昵称应具有相同的表结构(2)
没有图释

4.成功创建昵称后,上述两个昵称以表的形式存储在联邦数据库系统中,如下图所示:


图 88. 两个昵称以表的形式存储在联邦数据库系统中
两个昵称以表的形式存储在联邦数据库系统中

5.利用INSERT语句,将Excel昵称中的信息插入到Oracle昵称中。 本例中,我们将PRODUCTS$昵称中所有的数据,都复制到目标昵称IPRODUCT中。也可以通过不同的SELECT语句参数,选择性的将昵称中的数据插入到目标昵称中。


图 89. 将PRODUCTS$昵称中的数据复制到目标昵称IPRODUCT中
将PRODUCTS$昵称中的数据复制到目标昵称IPRODUCT中

(其它改进形式:insert into TARGET(F2,F3) select F2,F3 from PRODUCTS)

6.对比复制成功后联合数据库Excel昵称中的数据与Oracle目标昵称中的数据,如下图所示:


图 90. 对比复制成功后的数据
对比复制成功后的数据

7.上面步骤实现了Excel到Oracle的复制,事实上,要将Excel数据复制到MySQL这样的开源数据库,只需要将MySQL数据库的目标表注册为ODBC数据源(和将Excel注册为ODBC数据源完全类似),然后按照上述步骤进行即可,具体请参见本文附带的演示录像。





回页首


注: 本文中所使用的Excel文件


图 91. 本文中所使用的Excel文件
本文中所使用的Excel文件

注意:作为联合数据库数据源的Excel表中,每一列必须由同一数据类型的数据组成。如果Excel中的同一列存在着不同数据类型,如下图所示:


图 92. 同一列存在着不同数据类型
同一列存在着不同数据类型

虽然仍然可以正确的创建昵称,但是当在DB2中使用昵称访问Excel表的信息的时候,数据库管理器会因为实际的数据的数据类型和列定义中的数据类型不同而发生错误,如下图所示,也就是说,昵称中的每一列的数据必须具有单一的数据类型。


图 93. 错误信息
错误信息


参考资料

  1. 《SQL Replication Guide and Reference》
  2. 《Federated Systems Guide》
  3. 《Data Source Configuration Guide》
  4. http://www.ibm.com/support/us/
  5. http://publib.boulder.ibm.com/infocenter/db2luw/v8//index.jsp
  6. http://www.ibm.com/developerworks/db2/roadmaps/sqlrepl-roadmap-v8.2.html


关于作者

肖振春,IBM 中国软件开发中心软件工程师,来自 DB2 WebSphere Information Integrator 项目组。从事 DB2 UDB for Linux、UNIX 和 Windows 软件测试和技术支持。目前着重于 DB2 Federation System 和 DB2 Replication。目前着重于 DB2 Federation System 和 DB2 Replication,主要关注 SQL、DB2 应用程序开发及客户技术支持。Mail:xiaozc@cn.ibm.com




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?







回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款