在 DB2 for z/OS 中构建 pureXML 应用程序,第 1 部分: 使用 COBOL 存储过程存储和操纵数据
2009-12-27 00:00:00 来源:WEB开发网简介
本文是 本系列 的第一期,本系列讨论如何在 IBM® DB2® for z/OS® 中使用 XML。本系列介绍创建操纵 XML 数据的简单应用程序的不同方式。目标是帮助您熟悉 pureXML 技术,展示开发 XML 应用程序是多么容易。可下载的示例还可以作为开发原型的起点。
随着 SOA 和基于 Web 的技术日益流行,计算机系统处理的 XML 数据量越来越大了。DB2 9 for z/OS 的 pureXML® 支持通过 SQL/XML 接口大大简化了在 System z® 上存储和操纵 XML 的过程。本文讨论如何创建两类 COBOL 存储过程:
基本操作:在 DB2 for z/OS 中插入、更新和删除 XML
复杂操作:通过指定 XPath 选择 XML,把 XML 分解到关系表中,用关系数据组合出 XML
在本文附带的下载包中提供所有存储过程的示例。本文还讨论一些高级概念,例如:
在把 XML 数据传输到和传输出 DB2 for z/OS 中的存储过程时的数据转换。
在 XMLEXISTS 中使用 XPath 筛选数据。
系统需求
为了安装和运行 COBOL 示例,需要有 DB2 9 for z/OS 和 IBM Enterprise COBOL for z/OS 4.1.0。
下载包
下载 部分中的下载包包含:
COBOL 源代码
推荐的编译器选项列表
8 个示例存储过程的 DDL
存储过程使用的表的 DDL
XML 模式文档
在 DB2 中注册模式的脚本
示例 XML 文档
一个演示如何调用存储过程的 Java 程序
README.txt 文件,包含关于如何部署 COBOL 存储过程的说明
图 1 显示下载包的内容:
图 1. 下载包的内容
行业包
本文提供的存储过程基于 UBL (Universal Business Language) 2.0 格式。可以在文章 “快速构建 DB2 pureXML 应用程序”(developerWorks,2008 年 12 月)中下载其他行业格式的 DB2 pureXML 行业包,其中包含表定义、模式、示例文档和查询。可以通过 “XML Schema Tutorial” 了解如何使用示例作为构建原型应用程序的基础。
几个基本 XML 概念
本文假设您熟悉 XML;但是为了更好地说明每个存储过程的用途,我们先来明确几个概念:
良构的 XML 文档是一个树的文本表示。树的根是文档本身,每个节点对应于一个元素或字符数据。元素可以包含一系列元素(在这种情况下,相应的树节点有子节点)或字符数据(在这种情况下,节点是叶节点)。元素可以有属性,属性也映射到子节点;名称空间是一种特殊的属性,它们用来限定名称,以避免在不同 XML 格式的元素之间出现名称冲突。
清单 1 给出一个符合(简化的)UBL 2.0 格式的 XML 文档:
清单 1. 浏览器中显示的 XML 文档<Invoice xmlns:cac=
"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc=
"urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
<cac:AccountingCustomerParty>
<cbc:CustomerAssignedAccountID>XFB01</cbc:CustomerAssignedAccountID>
<cac:Party>
<cac:PartyName>
<cbc:Name>IYT Corporation</cbc:Name>
</cac:PartyName>
<cac:PostalAddress>
<cbc:StreetName>Avon Way</cbc:StreetName>
<cbc:PostalZone>ZZ99 1ZZ</cbc:PostalZone>
<cac:AddressLine>
<cbc:Line>3rd Floor, Room 5</cbc:Line>
</cac:AddressLine>
<cac:Country>
<cbc:IdentificationCode>GB</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:Party>
</cac:AccountingCustomerParty>
</Invoice>
图 2 显示这个文档的树形式:
图 2. 树形式的 XML 文档
查看原图(大图)
在图 2 中,元素节点显示为蓝色,包括:
Invoice
cac:AccountingCustomerParty
cbc:CustomerAssignedAccountID
cac:Party
cac:PartyName
cbc:Name
cac:PostalAddress
cbc:StreetName
cbc:PostalZone
cac:AddressLine
cbc:Line
cac:Country
cbc:IdentificationCode
属性节点显示为红色,包括:
xmlns:cac
xmlns:cbc
xmlns:Invoice
字符数据节点显示为黑色,包括:
XFB01
IYT Corporation
Avon Way
ZZ99 1ZZ
3rd Floor, Room 5
GB
注意,所有元素名前面都有一个作为属性声明的名称空间。
示例数据库
本文的示例使用 XML 格式 UBL 2.0 (Universal Business Language) 的子集。UBL 2.0 是 OASIS 为电子商务开发的标准,能够相当全面地满足真实数据的需要。本文使用与发票相关的子集,它需要 11 个 XML 模式文档。关于 OASIS 和 UBL 2.0 的更多信息,请参见 OASIS Universal Business Language (UBL) Technical Committee 网页。
这个数据库由两个表组成。主表是 UBLADMIN.UBL,其中包含 XML 数据;另一个表是一个小型的特殊表,用于保存从文档中分解出的数据。第二个表主要用于演示,对于真实的应用程序,第一个表可能就足够了。
清单 2. UBLADMIN.UBL 表的列ID INTEGER GENERATED ALWAYS AS IDENTITY
COMMENT VARCHAR(1000)
DOCUMENT XML
示例存储过程
示例存储过程是用 COBOL 编写的。为了更好地说明在 DB2 for z/OS 中操作 XML 实际需要什么,这些存储过程尽可能保持简单。
在所有存储过程中,用于 XML 文档的参数类型是 CLOB。目前,存储过程和用户定义函数不支持 XML 作为参数,但是很容易作为 CLOB 传递 XML。
基本操作
本文为 XML 文档提供三种基本操作:插入、更新和删除。这些都是通用操作,可以用于大多数应用程序,甚至是使用非 UBL 2.0 格式的 XML 应用程序,因为这些存储过程本身不包含应用程序或格式特有的代码。在使用 XML 模式时,作为参数传递它。
对于插入和更新操作,本文提供两种风格的存储过程:带模式检验的和不带模式检验的。
模式检验过程检查 XML 文档是否符合 XML 模式定义的规则和格式。这些规则定义哪些元素是有效的、文档中元素的次序、属性的数据类型、一个元素是必需的还是可选的等等。关于 XML 模式的更多信息,请参见 “XML Schema tutorial”。
在不带模式检验进行插入或更新时,文档必须是良构的。
检验文档需要向 DB2 注册模式。本文提供 UBL 2.0 Invoice 的模式,它由 11 个单独的模式文档组成。本文还提供脚本 Invoice.clp,它通过 DB2 命令行处理程序注册由这些文档组成的模式 SYSXSR.UBL_INVOICE_2_0。
Samples 文件夹中提供的 XML 文档示例对于这个模式都是有效的。
对于插入、更新和删除操作,不带模式检验的存储过程分别是 INSXML、UPDXML 和 DELXML。对于插入和更新操作,带模式检验的存储过程分别是 INSVLXML 和 UPDVLXML。
复杂操作
另外,本文提供三个用于复杂 XML 数据操作的存储过程。这些操作是与应用程序和格式相关的,不是通用的,必须根据不同的场景调整。对于其他领域和用法,可以以这些示例作为基础进行调整。
每个存储过程使用不同的 DB2 XML 构造。本文简要讨论这些构造,详细说明请参见 “DB2 Version 9.1. for z/OS, XML Guide”(IBM Corporation,2008 年 12 月)。
SELXML
存储过程 SELXML 使用 XPath 查询 XML 文档中的数据。XPath 是 W3C 推荐的访问 XML 文档中数据的标准,它已经集成在 DB2 中了。
XPath 支持在 XML 树中移动、根据节点名称或通过使用 Boolean 表达式选择节点以及对一系列节点应用函数。它接受一个 XML 文档作为输入,返回一系列节点或对一系列节点应用函数的结果。关于 XPath 2.0 的更多信息,请参见 “XML Path Language (XPath) 2.0”(W3C,2007 年 1 月)。
在 DB2 中,XPath 表达式被包围在一个函数(XMLQUERY 或 XMLEXISTS)中,这个函数应用于一个 XML 列,返回 XML 类型的结果。然后,可以使用函数的输出作为另一个接受 XML 参数的函数的输入,也可以把它转换为等效的 SQL 数据类型。更多信息请参见 “DB2 Version 9.1. for z/OS, XML Guide”。
SELXML 中使用的 XPath 表达式见清单 3:
清单 3. SELXML 中使用的 XPath 表达式declare default element namespace
'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2';
declare namespace cbc=
'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2';
declare namespace cac=
'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2';
/Invoice[cac:PaymentMeans/cbc:PaymentDueDate=$PAYMENTDATE]
/cac:LegalMonetaryTotal
/cbc:PayableAmount
表达式的第一部分包含名称空间声明(在这里是 UBL 2.0 Invoice)和一些辅助名称空间;这些名称空间用于确保使用的所有元素名的惟一性。
XPath 表达式的第二部分在 XML 树中通过节点 Invoice 和 LegalMonetaryTotal 移动到 PayableAmount,如果方括号中的 Boolean 表达式是 true,就返回这个元素。这个 Boolean 表达式要求 PaymentDueDate(Invoice 的子节点 PaymentMeans 的子节点)必须等于 $PAYMENTDATE(由主机变量提供的一个值)。
简单地说,如果应付款日期与主机变量中提供的值匹配,它就返回应支付金额。这个 XPath 表达式与存储过程中的其他 SQL 相结合,返回在输入的日期应该支付的总金额。
SHREDXML
存储过程 SHREDXML 使用 DB2 函数 XMLTABLE 把 XML 文档分解为关系数据,它指定一个在 XML 文档中移动的 XPath,以表的形式返回结果。可以使用它把 XML 数据与关系数据结合在一起。
可以以许多不同的方式使用 XMLTABLE 函数。SHREDXML 包含下面三个组成部分:
UBL 2.0 Invoice 的名称空间声明和辅助名称空间。
一个上下文项,它是一个 XPath 表达式,指向作为列表达式的起点的节点(即 AccountingCustomerParty)。
所需的表列的列定义。这包括名称、数据类型和一个 XPath 表达式(使用上下文项作为起点定义列内容)。定义的列包括 ACCOUNT_ID、NAME、CONT_PERSON、PHONE 和 EMAIL。
这样就可以为 UBL 2.0 Invoice 文档创建一个关系视图,提供详细的客户联系信息。
提供的 DDL 中的 UBLADMIN.CUSTOMER 表与这个存储过程的输出格式匹配。
TAGXML
存储过程 TAGXML 使用 XMLELEMENT 和其他相似的 DB2 发布函数用关系数据组合出 XML 文档。发布函数用 SQL 值或其他 XML 值构造 XML 值。表 1 描述一些最常用的发布函数。
表 1. 常用的发布函数
名称 | 说明 |
XMLDOCUMENT | 返回一个 XML 值,其中有一个文档节点和零个或更多子节点。 |
XMLNAMESPACES | 根据参数构造名称空间声明。 |
XMLELEMENT | 返回一个 XML 值,它是一个 XML 元素节点。 |
XMLATTRIBUTES | 根据参数构造 XML 属性。 |
XMLCONCAT | 返回数量可变的 XML 输入参数的串联结果。 |
XMLFOREST | 返回一个 XML 值,它是一系列 XML 元素节点。 |
发布函数的作用与 XMLTABLE 函数相反。
为了强调这一点,本文使用 TAGXML 实现与 SHREDXML 正好相反的功能(换句话说,它用关系表中的详细客户联系信息组合出 XML 元素)。UBLADMIN.CUSTOMER 表是组合 XML 元素的起点,生成的 XML 元素具有与相应的 UBL 2.0 Invoice 子集相同的内部结构。
部署存储过程
只需五个简单的步骤即可完成存储过程的部署:
通过运行 Tables.txt 中提供的 DDL 在 DB2 中创建表,例如可以使用 SPUFI。
使用您系统上可用的过程对每个 COBOL 装载模块进行编译、链接编辑和部署并绑定 DBRM。在子文件夹 COBOL source 中可以找到 8 个存储过程的 COBOL 源代码,其中的 Compiler options.txt 文件列出推荐的编译器选项。请注意,需要 QUOTE 和 QUOTESQL 选项。
通过运行 SP.txt 中提供的 DDL 创建存储过程,例如可以使用 SPUFI。这个文件包含所有存储过程的 DDL;如果不希望实现所有存储过程,可以在实现之前从文件中删除它们。在运行之前,做以下修改:
把 WLM 环境改为您站点上运行 COBOL 存储过程的环境。(当前名称是 DSN9WL4K)。
把集合 id 改为您要为存储过程使用的集合。(当前名称是 UBLADMIN)。
在 Windows 计算机上,通过 DB2 命令行处理程序运行脚本 Invoice.clp,从而注册 XML 模式 UBL 2.0 Invoice:
通过从 Start 菜单运行 db2cmd,打开 DB2 命令行处理程序。
连接希望注册 XML 模式的 DB2 子系统。
进入 Schema 文件夹。
通过输入以下命令,运行 Invoice.clp 文件中的命令: db2 -f Invoice.clp
使用提供的 Java 程序 testStoredProcedures.java 和 Samples 文件夹中的测试数据测试存储过程。
在程序中修改连接 DB2 for z/OS 所需的信息。这包括主机名(z/OS 系统的 IP 地址或逻辑名称)、端口号、DB2 子系统的位置以及用于连接的用户 id 和密码。
打开一个 Windows 命令提示,进入 COBOL 存储过程的 samples 文件夹。
用 javac testStoredProcedures.java 命令编译程序。
用 java testStoredProcedure <SPName> 命令运行程序,其中的 <SPName> 是要测试的存储过程的名称。注意,值硬编码在测试程序中,所以只有某些测试序列是有意义的。详细信息请参见 README.txt 文件或程序本身。
高级考虑因素
数据转换
在提供的示例中,使用 CLOB 在存储过程传入和传出 XML 值。有时候,BLOB 更适合传输 XML,这可以避免在进入和退出存储过程时进行数据转换。数据转换会消耗大量 CPU 处理时间,而且如果过渡编码页无法表示 XML 中出现的某些字符,就会丢失数据。本文提供的示例使用 CLOB,因为操纵基于字符的变量更容易。
在使用 CLOB 时,为了避免不必要的过渡数据转换,可以在存储过程参数声明中指定 CCSID UNICODE for MIXED DATA。由于禁止了转换,COBOL 存储过程程序员必须知道 XML 变量包含 UTF-8 数据,而 COBOL 存储过程中的其他变量很可能采用 EBCDIC 编码。
在指定了 CCSID UNICODE for MIXED DATA 时,DB2 for z/OS 忽略 XML 文档头中的内部编码声明,把内容当作 UTF-8。DB2 for z/OS 总是以 UTF-8 编码存储 XML。
图 3 说明在指定和不指定 CCSID UNICODE for MIXED DATA 两种情况下发生的情况:
图 3. 过渡编码页转换
用 XPath 筛选数据
可以用 XPath 筛选数据。XMLEXISTS 是一个 Boolean 函数,它接受一个 XPath 表达式作为输入;如果这个 XPath 表达式返回空序列,它会返回 FALSE,否则返回 TRUE。可以在 SQL 语句的 WHERE 子句中使用它只选择那些对于 XPath 表达式返回非空 XML 值的行。XMLEXISTS 使用的 XPath 表达式语法与 XMLQUERY 使用的 XPath 表达式语法相同。
相关示例见存储过程 DELXML。
结束语
本文是 本系列 的第一期,本系列讨论如何在 DB2 for z/OS 中存储和操作 XML。本文讲解了如何创建和部署在 DB2 for z/OS 中存储和操作 XML 的 COBOL 存储过程。这里使用 UBL 行业格式作为示例数据的基础。也可以使用其他行业格式和定制的 XML 文档。
本文示例源代码或素材下载
- ››db2 对float类型取char后显示科学计数法
- ››DB2中出现SQL1032N错误现象时的解决办法
- ››DB2 锁升级示例
- ››db2诊断系列之---定位锁等待问题
- ››Form Reset Function
- ››OSC“回到顶部”代码
- ››db2 命令选项解释
- ››OSCHINA 使用 Github 登录的源码
- ››FOREACH 宏之GCC实现
- ››DB2 最佳实践: 使用 DB2 pureXML 管理 XML 数据的...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
更多精彩
赞助商链接