级别: 初级 用于电子商务的数据库技术IBM 硅谷实验室
2002 年 12 月 01 日 DB2 和 XML 专家 Susan Malaika 指明了使用 DB2 和 XML 时可用于处理数据的选项。
Susan Malaika 从 1995 年以来一直是 IBM 技术研究院(Academy of Technology)的成员。她在 1996 年与人合著了一本有关 Web 的书。她从 1998 年开始从事 DB2 工作,并专长于 XML 和 Web 技术,包括网格计算。她的个人兴趣包括歌剧、电影、戏剧以及后来的科幻小说。
在 Susan 的上一篇
专栏文章中,她讨论了 XML 标准,并指出在数据库管理系统(如 DB2)中,显著地增加了 XML 功能,如发布、存储、查询和转换 XML 的重要特性。在本专栏文章中,Susan 回答了关于 DB2 中的 XML 工具的问题,并对截至本次采访结束为止可用的工具提供了简要介绍。
DB2DD:Susan,上次您使我们相信数据库人员应该时刻关注 XML 领域中所发生的事情。对于正在实现结合 XML 的系统的数据库架构设计师和管理员们,您有什么建议?他们应该从哪里入手呢?
Susan:第一步是确定他们所使用的应用程序是否需要:
- 根据关系数据发布 XML。
- 操作和转换 XML。
- 在 DB2 中存储 XML。
下一步是更详细地研究合适的选项。我将尽量提供指向关于每个选项信息的指示,如
图 1所示。
图 1. XML 生命周期
DB2DD:逻辑上的第一步是什么?
Susan:当应用程序为了在组织内或向外部以常用格式将关系数据传输到另一个系统或应用程序,而开始使用 XML 时,最常见的第一步是根据关系数据发布 XML。
DB2DD:那么,在 DB2 中根据关系数据发布 XML 有哪些选择呢?
Susan:根据保存在 DB2 表中的关系数据发布 XML 文档的选项有很多,包括:
DB2DD:选项很多啊!在这些发布选项中您推荐哪些呢?
Susan:如果您是在 UNIX 或 Windows 上使用 DB2 V8.1,请一定尝试一下用于发布的 SQL/XML 函数。我们认为您会喜欢它们的。您也可能会喜欢通过创建 SQL/XML 视图进行实验,以便可以将应用程序与所用的特定标记方案隔离开来。连同通过 DADX 定义实现的 DB2 Web 服务支持,还可以将 SQL/XML 发布函数的结果作为 Web 服务发布。上面提到的 SQL/XML 发布函数教程中包括 DADX 示例。
DB2DD:当从关系数据发布文档时有没有什么特别的考虑事项呢?
Susan:有几点需要考虑:
-
您想产生一个文档还是多个文档?例如,DB2 XML Extender 文档组合存储过程和 DAD 都支持这两种可能的情况。确保不要生成工具无法处理的巨型文档,譬如上千兆字节长度的文档。
- 您是否希望产生具有 XML 和编码(encoding)声明的完整文档?如果是,那么一定要当心,输入正确的编码声明,尤其是在想用通用解析器处理所发布的文档的情况下。请参阅
DB2 XML Extender Administration and Programming 的附录 B 以了解 XML Extender 所支持的编码声明。
-
您想把发布的文档保存在内存中?表中?文件中?作为 Web 服务结果保存,或者放在 WebSphere MQ 队列中?您可以通过 DB2 提供的 SQL 工具在这些选项中任意进行选择,如
图 2 所示。
图 2. 发布 XML 的机制
DB2DD:那么您会推荐使用这些可能的保存方式中的哪些呢?
Susan:输出方法(内存、Web 服务或 WebSphere MQ)通常是根据应用程序需求确定的。因此,如果您在 UNIX 或 Windows 上使用 DB2 V8.1,那么我建议您在下列情况下使用 SQL/XML 函数:
- 用于内存输出。
- 和 DB2 XML Extender 内容函数一起用于文件输出。
- 和 SQL INSERT 一起用于关系表输出。
- 与 DB2 中的 MQ 函数(如 MQSEND)一起用于 WebSphere MQ 输出。
- 与 DB2 Web 服务(DADX)一起用于 Web 服务输出。
DB2DD:好,接下来让我们来讨论转换。让我们假定有人向我发送了一些 XML 文档 — 转换和操作这些文档有哪些选项呢?
Susan:DB2 XML Extender 提供了许多通过 SQL 操作 XML 的函数。假定您允许数据库或系统使用 DB2 XML Extender,则您就可以使用这些函数。如果使用以常规 CLOB 或 VARCHAR 形式保存的 XML(函数分别对 XMLCLOB 类型或 XMLVARCHAR 类型进行操作),则可以将参数数据类型转换成常规 CLOB 或 VARCHAR。下面是 SQL 函数的分类摘要列表。您可以在 XML Extender 文档中找到更多信息。
-
验证:针对 XML Schema(SVALIDATE)或 DTD(DVALIDATE)进行验证。
-
转换:要通过样式表转换 XML,使用 XSLTransformToClob 和 XSLTransformToFile。您可以使用这些 SQL 函数将 XML 转换成 HTML。
-
复制:要在文件系统和 SQL 数据类型之间进行复制,使用内容函数(XMLVARCHARFromFile、XMLCLOBFromFile、XMLFILEFromVarchar 和 XMLFILEFromCLOB)。
-
抽取 XML 片段:要从 XML 文档进行抽取,使用标量函数(extractCLOBs)和表函数(extractCLOB)。
-
抽取 SQL 值:要从 XML 文档抽取值,使用诸如 extractInteger、extractChar 之类的函数。
-
更新:要修改元素内容或属性值,使用更新函数。
可以使用这些函数处理您创建、接收和存储的 XML — 我未对操作 WebSphere MQ 和 XML 的 SQL 函数进行总结。
DB2DD:即使省略了不少内容,但还是有很多函数啊!让我们继续,讨论存储。要在 DB2 中存储 XML,我的选项有哪些呢?
Susan:您需要作出的第一个决定是:您是希望将 XML 连同标记原封不动地存储起来,还是剥离标记,只存储内容和属性值。后一种方法称为分解(shredding 或 decomposition)。您可以使用多种标准来确定最合适的存储方法:
- 原封不动地存储 XML 的理由:
- XML 文档已经存在,并且您出于审计目的希望原封不动地存储 XML 文档。
- 您知道这些 XML 文档经常被读取但很少被更新,并且用户总是希望查看原始文档。
- 您知道经常搜索哪些元素和属性,并因此希望创建 XML Extender 副表。
- 您希望通过 DB2 XML Extender XMLFILE 机制将 XML 文档保存在 DB2 外部的文件系统上。
-
存储已分解的 XML 的理由:
- 您希望使用文档内容来驱动现有的关系业务系统。
- 您需要经常更新 XML 文档内容,并且更新性能很重要。
- 您需要用分析软件处理文档内容。
可以将原封不动的 XML 存储与分解组合使用;例如,可以原封不动地存储 XML 保险索赔表单,同时用 XML 索赔表单
内容驱动现有索赔处理系统。如果您不需要所有内容或内容有重复,也可以进行部分分解,如果您愿意的话。
DB2DD:当我分解文档时,是否意味着我再也无法重新构建该文档了?
Susan:通常,当分解时,您会丢失空格和行结束符:数据库人员通常认为空格和行结束符之间的东西是重要内容。丢失空格会影响 XML 的布局,这意味着您也许不能精确地重组文档,无法将它恢复到接收时的外观。对于数据驱动的 XML,这通常无关紧要,而对于文档驱动的 XML,这通常会有影响。
DB2DD:对于存储,我可以使用什么存储机制?
Susan:总的来说:
- 如果希望原封不动地存储 XML,则可以使用常规 SQL INSERT 语句将它存储为 SQL CLOB 或存储为 XML Extender XML 类型:XMLVARCHAR、XMLCLOB 和 XMLFILE。
- 如果希望分解,可以使用 XML Extender 分解存储过程:dxxShredXML 或 dxxInsertXML 以及描述应该如何完成分解的 DAD。先前提到的由 David Russell 撰写的文章向您展示了如何通过 WebSphere Studio 构建 DAD。
“XML programming with SQL/XML and XQuery”也提供了构建 DAD 的高级描述。
DB2DD:对于通过不同来源生成的 XML 会怎么样呢?我能存储它吗?
Susan:是的,和发布一样,可以存储通过各种方式生成的 XML,如
图 3 所示:
-
来自内存:缺省行为是通过 SQL INSERT 将保存在内存中的 XML 文档存储成 SQL CLOB 或 DB2 XML Extender XML 数据类型。如果进行分解,那么可以使用 XML Extender 存储过程 dxxShredXML 或 dxxInsertXML。
-
来自文件:可以使用 DB2 XML Extender SQL 函数将保存在文件中的 XML 复制到内存中,然后继续进行存储的过程。
-
来自表:可以将 SQL SELECT 语句与 SQL INSERT 或 XML Extender 存储过程结合使用,以存储已经保存在表中的 XML 文档。
-
来自 WebSphere MQ:可以使用 SQL WebSphere MQ 函数(如 MQREAD、MQREADCLOB、MQRECEIVE 和 MQRECEIVECLOB)从 WebSphere MQ 队列读取文档,并通过 SQL INSERT 语句将文档原封不动地存储起来。可以在 DB2 SQL Reference 第 1 卷找到关于这些 MQ 函数的信息。有一些 DB2 XML Extender存储过程可以对保存在 WebSphere MQ 中的 XML 文档进行分解,例如 dxxmqShredCLOB、dxxmqShredAllCLOB 和 dxxmqInsertCLOB。XML Extender 文档中描述了这些存储过程。
-
来自 Web 服务输出:对于原封不动的 XML,可以在 DADX 中包括 SQL INSERT 语句并将希望存储的 XML 文档作为输入参数来传递。类似地,对于分解 XML,可以调用 XML Extender 分解存储过程,通过
WORF 论文中描述的特殊 DADX 标记“storeXML”把要分解的文档作为输入参数来传递。
图 3. 存储 XML 的机制
DB2DD:有很多种可能性。您能否指明哪种功能适用于哪种情况?
Susan:表 1 是可用性摘要表,也许它会有助于回答这个问题。当然,事情总是在不断变化的。
表 1. 功能和平台摘要
|
功能
|
UNIX 和 Windows 上的 DB2
|
iSeries 上的 DB2
|
zSeries 上的 DB2
| | SQL/XML 发布 | V8.1 | 计划中 | 计划中 | | XML Extender | V7.2 | V5.1 | V7 | | XML Extender MQ 函数和存储过程 | V7.2 | 计划中 | 计划中 | | MQ 函数 | V7 | 计划中 | V7 通过 PTF UQ71197 获得 | | 通过 DB2 WORF 的 Web 服务 |
- V7.2 Web 下载
- V8.1 GA
- WebSphere Studio
| 请参阅
WebSphere 产品页面
| 计划中 |
DB2DD:当发布、转换或存储 XML 时,是否有特定于平台的问题?
Susan:在 iSeries 或 zSeries 上使用 EBCDIC 时要清楚一些要点:
- 尽管大多数常见 EBCDIC 字符在 EBCDIC 代码页中具有相同的代码点,但在影响 XML 的领域中存在一些变长字符,例如,不同 EBCDIC 代码页中惊叹号“!”编码的代码点就不同。XML 对于惊叹号字符是敏感的。有关变长字符的更多信息,请参阅
C/C++
Programming Guide中题为 Variant Character Detail 的章节。大体上,在使用以 EBCDIC 表示的 XML 时,不执行数据转换就无法混合和匹配不同的 EBCDIC 代码页(如 ibm-1047 和 ibm-037 两者之间就不行)。在典型环境中,DB2 对作为参数(如存储过程参数)传递的 XML 的相应的 DB2 代码页间进行相互转换。
- 您可以使用和生成 EBCDIC 格式的 XML,但请注意 XML 编码声明及其影响。请参阅
zSeries
XML Extender 文档中的附录 C 和
iSeries
XML Extender 文档中的附录 B。
这里是一些仅适用于 zSeries 的要点:
- 您必须在系统上安装 XML Toolkit 的适当版本。请参阅信息 APAR ii13151 和 ii13454 以获取更多详细信息,还可以参阅 XML Toolkit 主页:http://www.ibm.com/servers/eserver/zseries/software/xml/ 以获取更多信息
- XML 1.0 不支持 zSeries 上的 USS(UNIX 系统服务,UNIX Systems Services)中生成的行结束符 [NEL]。需要使用 XML 1.1 来与 USS 生成或存储的包含这样行结束符(换行字符)的文档一起工作。XML Extender 和 XML Toolkit 确实会处理 USS 行结束符,但 XML 1.1 之前其它通用 XML 软件可能无法处理这些文档。请参阅:
-
用于 zSeries 的 DB2 XML Extender 样本和文档中的 Getting Started 一章假定使用 USS,但是使用 USS 并不需要 DB2 XML 应用程序本身。USS 主要用于 XML Extender 内部使用,特别地,例如 XML Extender 使用 USS 文件系统来解决处理文档过程中偶尔发生的溢出情况。所以 USS 中的 HFS 文件系统必须是可用的。
DB2DD:使用 XML 时会有什么风险吗?
Susan:“风险”这个词可能太严重了些,但有许多方面是需要特别关注的,包括:
- 确保对系统将要处理或生成的每个 XML 文档的大小都有良好的理解,以确保不超出任何限度或不产生难以处理的文档。例如,如果您在使用 DOM 处理文档,则会发现,如果文档很大就会用尽内存。您可能会发现没有能够查看或修改所生成文档的编辑器。
- 用类似于生产数据的数据试验系统。这是一个很容易理解的说法,但我们已经听到过,一些人对 XML 验证,或仅仅是常规 XML 解析的代价感到惊讶。
- 考虑将 XML 数据初次装入系统所花费的时间,包括分解或原封不动存储的 XML。尝试装入数据的子集(在 XML 嵌套级别、文档大小等方面类似于生产数据),以便切实地估算装入时间。
- 使用 15 层以上的嵌套和/或拥有大量重复的元素或属性名称(例如将所有属性称为“name”或“value”的“名称/值”对模式)时要慎重考虑。它只会使您的 XML 应用程序更难调试。
- 如果您并不真正需要 DTD 或模式验证,请慎重考虑。验证会消耗大量处理器时间。
- 尽量对 XML 文档使用 Unicode,以减少发生数据转换的次数(XML 解析器通常用 Unicode 格式进行操作)。
DB2DD:最后,您是否还有一些建议?
Susan:DB2 和 XML 关系很密切。主要的方向包括:
- 我们参与并计划在 SQL/XML 标准的组件稳定时实现该标准,因为我们已经完成了 SQL/XML 发布函数。
- 我们参与并计划在 XQuery 标准稳定时实现该标准。
- 我们正在向 DB2 引擎中添加更多的 XML 功能,譬如 XML Extender 的组件。
- 我们计划通过包括数据联邦在内的各种机制来支持各种 XML 来源。
参考资料

 |

|
声明
所有有关 IBM 的未来方向或意向的信息都可以随时更改,而不另行通知,它们仅表示了目的和目标而已。
关于作者  | |  | 用于电子商务的数据库技术 has authored this article |
对本文的评价
|