WEB开发网
开发学院数据库DB2 在 DB2 for z/OS 中构建 pureXML 应用程序,第 1 ... 阅读

在 DB2 for z/OS 中构建 pureXML 应用程序,第 1 部分: 使用 COBOL 存储过程存储和操纵数据

 2009-12-27 00:00:00 来源:WEB开发网   
核心提示:简介本文是 本系列 的第一期,本系列讨论如何在 IBM® DB2® for z/OS® 中使用 XML,在 DB2 for z/OS 中构建 pureXML 应用程序,第 1 部分: 使用 COBOL 存储过程存储和操纵数据,本系列介绍创建操纵 XML 数据的简单应用程序的不同方式,目标是帮助您

简介

本文是 本系列 的第一期,本系列讨论如何在 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. 下载包的内容
在 DB2 for z/OS 中构建 pureXML 应用程序,第 1 部分: 使用 COBOL 存储过程存储和操纵数据


行业包

本文提供的存储过程基于 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 文档
在 DB2 for z/OS 中构建 pureXML 应用程序,第 1 部分: 使用 COBOL 存储过程存储和操纵数据

查看原图(大图)


在图 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. 过渡编码页转换
在 DB2 for z/OS 中构建 pureXML 应用程序,第 1 部分: 使用 COBOL 存储过程存储和操纵数据


用 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 文档。

本文示例源代码或素材下载

Tags:DB for OS

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接