为了帮助您快速掌握 DB2 自身的 XML 特性,请完成几个普通的任务,比如:
- 创建用于管理 XML 数据的数据库对象,包括一个测试数据库、一些示例表和视图。
- 使用 INSERT 和 IMPORT 语句将 XML 数据填充到数据库中。
- 验证您的 XML 数据。使用 DB2 开发和注册您的 XML 模式,并在导入数据时使用 XMLVALIDATE 选项。
后续文章将包括其他主题,比如使用 SQL 查询、更新和删除
DB2 XML 数据,使用 XQuery 查询
DB2 XML 数据,开发存取
DB2 XML 数据的 Java 应用程序和 Web 组件。
创建数据库对象 让我们先来创建一个单独的
DB2 Unicode 数据库。在
DB2 Viper 中,只有 Unicode 数据库才能同时存储 XML 文档和 SQL 数据的更多传统格式,比如整数、日期/时间、变长字符串,等等。随后,您将在这个数据库中创建对象来管理 XML 和其他类型的数据。
创建测试数据库 为了创建一个新的
DB2 Unicode “测试” 数据库,打开
DB2 命令窗口,发出语句来指定 Unicode 编码集合和支持的区域,如 清单 1:
清单 1. 创建用于存储 XML 数据的数据库
create database test using codeset UTF-8 territory us
|
一旦创建了 Unicode 数据库,您就不需要发出任何专门的命令或采取任何进一步措施来使
DB2 能够以它自身分层的格式存储 XML 数据,因为您的
DB2 系统已经准备好了。
创建示例表 为了存储 XML 数据,请创建包含一个或多个 XML 列的表。这些表充当文档集合的逻辑容器;在幕后,
DB2 实际上使用了不同的存储方案来存储 XML 和非 XML 数据。然而,使用表作为管理各种受支持的数据格式的逻辑对象,简化了管理和应用程序开发问题,特别是当需要在一个单独的查询中集成不同的数据格式时。
您可以对
DB2 表进行定义,使其只包含 XML 列、只包含传统 SQL 类型的列或者同时包含两者。本文对后一种情况进行了建模。清单 2 中的例子连接到 “测试” 数据库,并创建了两个表。第一个是 “items” 表,追踪关于货物的销售情况和顾客对货物的评价信息。第二个表追踪的是关于 “客户” 的信息,包括关于联系信息的数据。注意 “comments” 和 “contactinfo” 是基于新的
DB2 XML 数据类型,而所有其他的列都是基于传统 SQL 数据类型的。
清单 2. 创建用于 XML 数据的表
connect to test; create table items ( id int primary key not null, brandname varchar(30), itemname varchar(30), sku int, srp decimal(7,2), comments xml ); create table clients( id int primary key not null, name varchar(50), status varchar(10), contactinfo xml );
|
如果您仔细地查看这些表定义例子,您将注意到 “comments” 和 “contactinfo” 列都没有进行 XML 文档内部结构的定义。这是
DB2 的一个重要特性。用户不需要为了存储数据而预定义一个 XML 数据结构(或者,更准确地说是一个 XML 模式)。事实上,
DB2 可以在一个单独的列中存储任何格式良好的 XML 文档,这意味着不同模式的 XML 文档 —— 或没有和任何注册的模式关联的文档 —— 都可以存储在相同的
DB2 列中。当我们讨论如何在
DB2 中存储数据时,本文将深入讨论这个特性。
创建视图 您可以随意地在包含 XML 数据的表上创建视图,就像您可以在只包含传统 SQL 数据类型的表上创建视图一样。清单 3 中的例子创建具有 “Gold” 状态的客户的一个视图:
清单 3. 创建一个包含 XML 数据的视图
create view goldview as select id, name, contactinfo from clients where status='Gold';
|
关于索引的一点说明 最后,没有必要在 XML 列上创建专门的索引来提高数据的查询速度。因为这是一篇介绍性文章,而且示例数据很少,所以本文不会涵盖到那个主题。然而,在生产环境中,定义一个适当的索引对实现最佳的性能来说很关键。查看本文结尾部分的 “参考资料”,以助于了解
DB2 的新索引技术。
存储 XML 数据 创建好表之后,现在您就可以用数据填充它们了。您可以通过直接发出 SQL INSERT 语句来完成这项工作,或者通过调用
DB2 IMPORT 工具在后台发出 INSERT 语句。
使用 INSERT 语句 使用 INSERT,您可以直接向
DB2 中填充原始的 XML 数据。如果您已经编写了一个应用程序并在变量中存储了 XML 数据,那么这可能是最容易的方法。但是如果您只是刚开始使用
DB2 Viper,并且不想编写应用程序,那么您可以交互地发出 INSERT 语句(我发现使用
DB2 Command Editor 是很方便的,虽然您也可以使用命令行处理器,如果您更喜欢那么做的话)。
要使用
DB2 Command Editor,请启动
DB2 Control Center。从顶端的下拉菜单 “Tools” 中选择 Command Editor,将出现一个单独的窗口,如 图 1 所示。
图 1.
DB2 Command Editor
在上面的窗格中输入下列语句:
清单 4. 交互地插入 XML 数据
connect to test; insert into clients values (77, 'John Smith', 'Gold', xmlparse(document '111 Main St., Dallas, TX, 00112' preserve whitespace) )
|
单击左侧的绿色箭头来执行该命令。
注意,联机提供 XML 数据(如 清单 4 所示)需要您调用 XMLPARSE 函数,以把文档从字符值转换成 XML 类型值。本例中的输入文档相当简单 。如果文档很大或者很复杂,把 XML 数据键入到像清单 4 所示的 INSERT 语句中是不切实际的。在大多数情况下,您使用主机变量或者参数标记编写一个应用程序来插入数据。您将发现本文带有一个简要的 Java 代码编写例子。然而,由于这是一个介绍性的教程,所以我们不会详细地讨论应用程序开发主题。相反,我们将讨论使用数据填充
DB2 XML 列的另一种选择 —— 使用 IMPORT 工具。
使用 DB2 IMPORT 如果您准备在文件中包含 XML 数据,
DB2 IMPORT 工具为您提供了一个使用数据填充
DB2 表的简单方式。您不需要编写应用程序,只需要创建一个定界的 ASCII 文件,其中包含您想要装载到表中的数据。参数为存储在文件中的 XML 数据指定了适当的文件名称。
您可以使用选择的文本编辑器创建一个定界的 ASCII 文件。(按照惯例,这些文件通常都是 .del 类型的)。文件中的每一行都代表了导入到表中的一行数据。如果行中包含 XML Data Specifier (XDS),IMPORT 将读取包含在引用的 XML 文件中的数据,并把数据导入到
DB2 中。例如,图 2 中的第一行包含了 Ella Kimpton 的信息,包括她的 ID、姓名和顾客状态。她的联系信息也包括在 Client3227.xml 文件中。
图 2. 输入到
DB2 IMPORT 的示例定界 ASCII 文件
Client3227.xml 文件的内容如 图 3 所示。就像您看到的,文件包含了 Ella Kimpton 的地址、电话号码、传真号码和电子邮件等 XML 元素。
图 3. 示例客户 XML 文件
如果您并不是对所有希望插入的行都有 XML 文件,那么您可能对导入数据感到好奇。这是很容易做到的,忽略输入文件的 XDS 信息即可。例如,图 4 中的 items.del 文件忽略 Item 3641(“Dress to Impress” 套装)的 XML 文件名。结果这一行的 XML 列不包含任何数据。
图 4. 示例定界 ASCII 文件中的一行没有 XML Data Specifier
有了 XML 文件和定界的 ASCII 文件,您现在就可以使用
DB2 IMPORT 了。清单 4 中的下面这个语句将 C:/XMLFILES 目录中的 clients.del文件中指定的内容导入到 “clients” 表中。
清单 4. 将数据导入到 “clients” 表中
import from clients.del of del xml from C:/XMLFILES insert into user1.clients;
|
如 图 2 所示的 clients.del 包含了六行数据,包括对六个 XML 文件的引用。成功地执行 IMPORT 命令后的结果输出如 图 5 所示。
图 5.
DB2 IMPORT 的示例输出
独立软件供应商,例如 Exegenix,提供了将 Word、PDF和其他文档格式转换成 XML 的工具,以便于导入到
DB2 中。(参见 参考资料,获得关于 Exegenix 的更多信息。)
验证 XML 数据 INSERT 和 IMPORT 示例只是讨论向表中写入格式良好的 XML 数据。它们并不对数据进行验证 —— 也就是说,它们不验证数据是否符合特定的 XML 模式,并因此坚持使用确定的结构。控制
DB2 那么做是可能的,然而,还是让我们研究另外一种方式来完成这项任务:
步骤 1:创建 XML 模式 为了验证 XML 数据,您需要定义一个 XML 模式,来指定可接受的 XML 元素、它们的顺序和数据类型,等等。 XML 模式是一个 W3C 行业标准并且是用 XML 编写的。尽管解释 XML 模式的特性超出了本文的范畴,但是 Web 上有各种教程可供参考(参见 “参考资料”)。
有许多方式可以开发 XML 模式,从使用您喜爱的文本编辑器到手动创建模式,再到使用工具图形化地设计或生成模式。独立软件供应商,例如 MDXSYS Limited,提供了这样的 XML 工具,IBM 也通过它的 Java™ 集成开发环境提供了 XML 模式生成支持。
例如,使用 IBM WebSphere® Studio,您可以将 Client3227.xml 文件(如 图 3 所示)导入到 Web 项目中。使用鼠标右击,并选择 Generate -> XML Schema。这将为特定的输入文件生成一个有效的 XML 模式,如 图 6 所示。然后您就可以修改该文件(如果需要)并将其注册到
DB2。
图 6. 使用 WebSphere Studio 从一个 XML 文件生成 XML 模式
让我们假定您需要使 XML 模式相当灵活,从而使您可以收集不同顾客不同类型的联系信息。例如,某些顾客可能向您提供多个电话号码或电子邮件地址,而其他顾客则没有提供这么多。
图 7 所示的 XML 模式源自 WebSphere Studio 生成的模式,提供了这种灵活性。它包括关于给定元素所允许的最小和最大出现次数(“minOccurs” 和 “maxOccurs”)的附加规范。在本例中,不要求顾客向您提供任何您想要收集的联系信息。然而,如果顾客选择给您电子邮件信息,该模式将启用一致性文档来包含最多 5 个电子邮件地址(即 5 个 “email” 元素值)。
图 7. 用于客户联系信息的示例 XML 模式
就像您已经注意到的那样,XML 模式也包含类型信息。尽管 图 7 所示的模式只指定所有的基本元素都被视为字符串,但是大部分生产 XML 模式也使用其他数据类型,比如整数、小数、日期,等等。如果您针对一个作为 INSERT 或 IMPORT 操作一部分的给定模式来验证 XML 文档,那么
DB2 将自动向您的 XML 文档添加类型注释。
步骤 2: 注册 XML 模式 创建了一个适当的 XML 模式之后,您就需要向
DB2 注册该模式。IBM 提供多种方式来完成这项任务。您可以从
DB2 Control Center 运行图形化的向导来指导您完成该过程,调用系统提供的存储过程,或直接发出
DB2 命令。在此让我们使用第二种方法,因为它能够帮助您更容易地理解在您那一端
DB2 实质上进行的操作。
如果您的模式非常大,您可能需要在尝试注册它之前增加应用程序堆的大小。例如,发出下列语句:
清单 4. 增加应用程序堆大小
connect to test; update db cfg using applheapsz 10000;
|
接下来,注册您的 XML 模式。如果您的 XML 模式没有引用其他 XML 模式,您可能需要用单个命令来注册并完成该过程。否则您还将需要发出单个命令来注册您最初的 XML 模式,添加其他需要的模式并完成注册过程。当模式文件变的非常大时,通常把它的内容分成多个文件来提高可维护性、可读性和重用性。这类似于把一个复杂的应用程序或组件分解为多个模块。关于这个主题的细节,请参考 W3C “XML Schema primer”(参见 “参考资料”)。
本文使用了一个简单、独立的 XML 模式。您可以使用下面这个命令将其向
DB2 注册:
清单 5. 注册 XML 模式
register xmlschema '' from 'C:/XMLFiles/ClientInfo.xsd' as user1.mysample complete;
|
在本例中,ClientInfo.xsd 是 XML 模式文件的名称,它位于 C:/XMLFiles 目录中。该 XML 模式将被注册到 SQL 模式 “user1” 和 XML 模式 “mysample” 下的
DB2 的内部存储库中。本例中的 参数只是一个占位符,它指定 XML 实例文档所引用的统一资源标识符 (URI);许多 XML 文档使用名称空间,这是用 URI 指定的。最后,“complete” 子句将指示
DB2 完成 XML 注册过程,以便模式可以用于验证 XML 数据。
值得注意的是,模式注册过程没有指定模式将应用到表的哪个(些)列。换句话说,模式不等于 SQL 列约束。一个给定的模式可以验证不同表中的各种 XML 列。然而,验证不是自动的。
DB2 允许任何格式良好的 XML 文档存储在 XML 列中。如果您想在存储之前验证一个已注册的模式数据,那么您需要指示
DB2 完成这项任务。
步骤 3:导入具有验证的 XML 数据
当创建了一个 XML 模式,并将它完全注册到
DB2 中之后,您现在就可以在将 XML 数据插入或导入表中的时候,让
DB2 对这些数据进行验证。现在我们头脑中有了模式验证,再来回顾一下先前的 IMPORT 场景。
如果您已经填充了 “clients” 表,您会发现可以非常方便地删除它的内容,或者删除和重新创建表。这只在当您计划像以前一样向表中添加相同的数据时才需要。回想一下被定义为在客户 ID 列上具有一个主键的 “clients”,尝试导入重复的行将失败。
为了在将 XML 数据导入到 “client” 表时能够对其进行验证,请使用
DB2 IMPORT 的 XMLVALIDATE 子句。清单 6 中的下面这个语句将指示
DB2 使用您先前注册的 XML 模式 (user1.mysample) 作为默认的 XDS (XML Data Specifier),在将它们插入到 “client” 之前验证 clients.del 文件中指定的 XML 文件。
清单 6. 导入具有验证的 XML 数据
import from clients.del of del xml from C:/XMLFILES xmlvalidate using xds default user1.mysample insert into user1.clients;
|
如果
DB2 确定一个 XML 文档不符合指定的模式,那么与该文档相关的整个行都将会被拒绝。图 8 阐释了从 IMPORT 操作的示例输出,在该操作中的六行有一行因为它的 XML 文档不符合指定的模式而被拒绝。
图 8. 来自
DB2 IMPORT 的示例输出,其中一行被拒绝
值得注意的是,XMLVALIDATE 也可以与 INSERT 语句一起使用,以指示
DB2 在插入之前验证 XML 数据。该语法与 IMPORT 例子所示的相似,即在调用 XMLVALIDATE 子句时指定一个已注册(和已完成)的 XML 模式。(参见 “一个简单的 Java 例子”,获取关于这方面的更多信息。)
结束语 DB2 Viper 提供了一个重要的新能力来支持 XML,包括一个新的 XML 数据类型和底层的引擎级组件,能够以有效的方式自动存储和处理 XML 数据。为了帮助您快速掌握这些特性,这篇文章描述了如何创建一个用于存储 XML 文档的测试数据库和示例表。还回顾了如何用 XML 数据填充数据库。最后总结了
DB2 针对用户提供的模式来验证数据的能力,并提供了示例来向您展示如何入门。
现在您已经学习了如何使用
DB2 的新的 “原生” XML 能力存储 XML 数据。至于如何查询那些数据,您将在后续文章中看到,后续文章将向您介绍
DB2 的新的 XQuery 支持,以及它对 SQL 的扩展(有时候叫做 “SQL/XML”)。