对比DB2 9和DB2 V8.x中的XML功能
2006-08-21 22:09:33 来源:WEB开发网简介
DB2 UDB Version 8.x 中的 xml(标准化越来越近了) 支持基于 DB2 的关系基础设施。xml(标准化越来越近了) 数据要么按原样存储为字符大对象(CLOB),要么分解到关系表中。另一方面,DB2 UDB Viper 具有真正的 xml(标准化越来越近了) 数据本机支持。现在,将 xml(标准化越来越近了) 数据作为一种新的数据类型处理,存储在一个经过解析并加上注释的树中,这个树是与关系数据存储分开的。还引入了基于 xml(标准化越来越近了) 模式的 xml(标准化越来越近了) 索引技术,并支持 XQuery 和 SQL/xml(标准化越来越近了) 作为查询和发布 xml(标准化越来越近了) 数据的语言。
DB2 UDB Version 8.x 中的 xml(标准化越来越近了) 支持
DB2 8.x 使用 SQL/xml(标准化越来越近了) 和 DB2 xml(标准化越来越近了) Extender 向底层关系数据提供 xml(标准化越来越近了) 功能。DB2 xml(标准化越来越近了) Extender 提供许多用户定义类型(UDT)、用户定义函数(UDF)和存储过程来支持 xml(标准化越来越近了)。xml(标准化越来越近了) 文档存储为关系形式,并使用 xml(标准化越来越近了) Extender 基础设施为关系数据提供 xml(标准化越来越近了) 表现形式。还支持一些用来将关系数据发布为 xml(标准化越来越近了) 的 SQL/xml(标准化越来越近了) 函数。更多细节可以在 DB2 xml(标准化越来越近了) Extender Web 站点上找到。
DB2 还允许创建用户定义的 Java 函数和存储过程,可以将 xml(标准化越来越近了) 和 XSL 解析器(作为 DB2 8.x 的一部分安装)合并到代码中。
DB2 Viper 中的 xml(标准化越来越近了) 支持
DB2 Viper 支持本机 xml(标准化越来越近了) 存储,从而不再需要将 xml(标准化越来越近了) 分解到关系表中供查询和发布。这种新的存储方式将 xml(标准化越来越近了) 保存为与 xml(标准化越来越近了) 文档对象模型(DOM)相似的经过解析并加上注释的树形式。对于仍然需要将 xml(标准化越来越近了) 数据分解到关系表中的应用程序,这个版本中还提供了增强的分解功能,这种功能使用带注释的 xml(标准化越来越近了) 模式映射。
xml(标准化越来越近了) 特性对比 —— DB2 UDB Version 8.x 和 DB2 Viper
表 1. xml(标准化越来越近了) 特性对比 —— DB2 UDB Version 8.x 和 DB2 Viper
DB2 UDB Version 8.x | DB2 Viper | |
存储和索引 | xml(标准化越来越近了) 数据存储为两种形式: 原样的文档:
| xml(标准化越来越近了) 数据存储为两种形式: 原样的本机文档 xml(标准化越来越近了) 存储。
|
验证 |
|
|
查询和发布 | 使用 SQL/xml(标准化越来越近了) 和 xml(标准化越来越近了) Extender 函数进行查询和发布。 对于原样的 xml(标准化越来越近了) 文档。
对于分解到关系表的 xml(标准化越来越近了) 数据。
| 使用 SQL/xml(标准化越来越近了) 和 XQuery 进行查询和发布。 对于原样的 xml(标准化越来越近了) 文档。
|
更新 | 对于原样的 xml(标准化越来越近了) 文档。
| 对于原样的 xml(标准化越来越近了) 文档。
|
为数据库启用 xml(标准化越来越近了) 功能 | 需要为数据库启用 xml(标准化越来越近了) Extender 功能。 | 不需要启用数据库,因为 xml(标准化越来越近了) 支持现在是 DB2 引擎的固有部分。 |
工具 | 在 DB2 Development Center 或 Control Center 中没有集成 xml(标准化越来越近了) 支持。 Websphere Studio Application Developer
| xml(标准化越来越近了) 支持集成到了工具的各个方面。 DB2 Control Center 和 DB2 Developers Workbench(基于 Eclipse)。
|
DB2 版本 | DB2 UDB Version 7.x 和 DB2 UDB Version 8.x DB2 z/OS Version 7 和更高版本(V8) iSeries V5R1 和更高版本(V5R3) | DB2 Viper AIX、NT、LINUX、SOLARIS |
DB2 UDB Viper 中引入的 xml(标准化越来越近了) 特性
在开始一步步地迁移示例应用程序之前,先简要地看看 DB2 UDB Viper 的 xml(标准化越来越近了) 支持。
xml(标准化越来越近了) 数据的存储
在与 DB2 的本机 xml(标准化越来越近了) 支持进行交互时,图 1 中所示的抽象是关系表中一个 xml(标准化越来越近了) 类型的列。任何良构的 xml(标准化越来越近了) 文档都可以插入这个列。在物理存储层,主存储单元是一个节点。
对于同时包含关系列和 xml(标准化越来越近了) 列的表,关系列存储为关系格式,xml(标准化越来越近了) 列存储为经过解析的树。
图 1. 与 DB2 的本机 xml(标准化越来越近了) 支持进行交互
xml(标准化越来越近了) 索引
xml(标准化越来越近了) 索引是一种新型索引,可以高效地计算 xml(标准化越来越近了) 路径表达式,从而提高查询 xml(标准化越来越近了) 文档的性能。
xml(标准化越来越近了) 索引使用一个 xml(标准化越来越近了)PATTERN(没有谓词的 XPath,只有一个子轴(/)和后代或本身轴(//))来对一个 xml(标准化越来越近了) 列中存储的 xml(标准化越来越近了) 文档的路径和值建立索引。在创建索引时,可以指定要为什么路径建立索引以及类型。在此列中存储的 xml(标准化越来越近了) 中,与路径表达式或路径表达式集合匹配的任何节点都被索引。索引直接指向存储中的节点,节点与它的父节点和子节点链接,便于快速导航。
create index idx3 on dept(deptdoc) generate key using xml(标准化越来越近了)pattern '/dept/employee/name' as sql varchar(35); |
XSR 是一个存储库,存储着用来验证和处理 xml(标准化越来越近了) 列中存储的 xml(标准化越来越近了) 实例文档的所有 xml(标准化越来越近了) 工件。XSR 避免了定位外部文档所需的额外开销以及可能产生的性能影响。每个数据库的数据库编目中包含一个 xml(标准化越来越近了) 模式存储库,并包含编目表、编目视图和一些系统定义的存储过程(用于进行注册)以便将数据输入这些编目表。xml(标准化越来越近了) 模式、DTD 和外部实体必须显式地在 XSR 中注册,然后才能使用。 带注释的模式映射
DB2 Viper 使用带注释的 xml(标准化越来越近了) 模式提供一种新的分解机制。并不创建单独的映射文件(DAD),而是用关系映射信息对 xml(标准化越来越近了) 模式进行注释。然后,将这些带注释的模式注册到 XSR。在运行时使用它们对要插入列中的 xml(标准化越来越近了) 文档进行分解。分解的 xml(标准化越来越近了) 值的数据类型是标准关系类型。可以使用关系索引技术为分解的关系列创建索引。更多信息请参考 “From DAD to annotated xml(标准化越来越近了) schema decomposition” (developerWorks,2006 年 4 月)。
图 2 给出一个带注释的模式映射示例。它展示整个 xml(标准化越来越近了) 文档以及从 xml(标准化越来越近了) 文档提取出的数据如何存储在同一个记录中。
图 2. 带注释的模式映射
原样的 xml(标准化越来越近了) 文档存储在 xml(标准化越来越近了)PO 列(xml(标准化越来越近了) 类型)中,提取出的 orderID 存储在 ORDERID 列(VARCHAR)中,orderDate 存储在 ORDERDATE 列(DATE)中。
SQL/xml(标准化越来越近了) 函数
xml(标准化越来越近了) 发布函数
文档构造过程就是用元素和属性这样的小块内容组合出 xml(标准化越来越近了) 值。SQL/xml(标准化越来越近了) 为这个过程提供了几个函数,可以从关系数据构造出 xml(标准化越来越近了) 文档。
DB2 UDB Version 8.x 中有以下这些用来发布的 SQL/xml(标准化越来越近了) 函数:
图 3. DB2 UDB V8.x 中的 SQL/xml(标准化越来越近了) 发布函数
DB2 Viper 支持 DB2 V8 中的所有 SQL/xml(标准化越来越近了) 函数(并接受或返回新的 xml(标准化越来越近了) 类型)。
还支持以下这些新的 SQL/xml(标准化越来越近了) 发布函数:
下面是用于 IN/OUT 和验证的新的 SQL/xml(标准化越来越近了) 函数:
xml(标准化越来越近了)PARSE
可以使用 SQL/xml(标准化越来越近了) 函数 xml(标准化越来越近了)PARSE 将表示 xml(标准化越来越近了) 文档的字符串值转换为 DB2 xml(标准化越来越近了) 类型。这个函数接受一个串行化的 xml(标准化越来越近了) 文档,将它转换为 xml(标准化越来越近了) 类型的实例。当需要改变默认的解析选项时,使用 xml(标准化越来越近了)PARSE。使用 xml(标准化越来越近了)PARSE 会使系统 “忘记” 正在处理 xml(标准化越来越近了) 数据,因为 xml(标准化越来越近了)PARSE 的输入是一个字符串或二进制类型。
insert into customer (cid, info) values (?,xml(标准化越来越近了)PARSE( DOCUMENT cast(? as BLOB(2M)) preserve whitespace )) |
这个伪函数将 xml(标准化越来越近了) 值转换为非 xml(标准化越来越近了) 数据类型,或者将非 xml(标准化越来越近了) 值转换为 xml(标准化越来越近了) 值。例如,它将 SQL/xml(标准化越来越近了) 值转换为 SQL 数据类型。它支持转换为 SQL 标量类型的子集。假设转换的源来自 xml(标准化越来越近了) 模式原子类型或无类型文本,或者是值为原子类型或无类型文本的节点。
values(xml(标准化越来越近了)CAST(xml(标准化越来越近了)QUERY('$m/customer/@cid' PASSING xml(标准化越来越近了)parse(document ' singh |
xml(标准化越来越近了)Validate 函数接受一个 xml(标准化越来越近了) 值并针对一个 xml(标准化越来越近了) 模式验证它,返回一个用 xml(标准化越来越近了) 模式中定义的默认值和类型注释生成的 xml(标准化越来越近了) 值。对于本机 xml(标准化越来越近了) 列,没有列级的 xml(标准化越来越近了) 模式验证。验证必须显式地添加到每个 insert 或 update 语句中。这允许将来自不同 xml(标准化越来越近了) 模式的 xml(标准化越来越近了) 文档保存在相同的列中。
注意: 不支持针对 DTD 进行验证。DTD 只用来添加默认值和解析实体引用。
insert into purchaseOrders (pid,porders) values (2, xml(标准化越来越近了)Validate(?)) |
is validated 谓词可以用来检查 xml(标准化越来越近了) 数据是否已经经过验证。它用于检查约束和在 WHERE 子句中对行进行过滤,而且不会受到用来验证的 xml(标准化越来越近了) 模式的影响。
Alter table purchaseOrders add constraint xml(标准化越来越近了)_check check (pOrder is validated)) Select pOrder from purchaseOrders where pOrder is validated |
xml(标准化越来越近了) 值在处理时采用一种内部表示方式,这不是字符串,也不能直接与字符串值进行比较。可以使用 xml(标准化越来越近了)SERIALIZE 函数将 xml(标准化越来越近了) 值转换为表示 xml(标准化越来越近了) 文档的串行化字符串值。在 DB2 驱动程序不支持 xml(标准化越来越近了) 类型的环境中,这个函数非常有用。
xml(标准化越来越近了)SERIALIZE 函数返回一个从 xml(标准化越来越近了) 表达式参数生成的指定数据类型的串行化 xml(标准化越来越近了) 值。结果的数据类型由用户指定。如果 xml(标准化越来越近了) 表达式的结果是空的,那么函数的结果是空值。返回的串行化 xml(标准化越来越近了) 值必须小于 2GB。串行化结果用 UTF-8 进行编码。
SELECT xml(标准化越来越近了)SERIALIZE ( CONTENT xml(标准化越来越近了)ELEMENT ( NAME "customer", xml(标准化越来越近了)ATTRIBUTES (e.cid AS "id"), xml(标准化越来越近了)ELEMENT (NAME "name", e.name), xml(标准化越来越近了)ELEMENT (NAME "email", e.email), xml(标准化越来越近了)ELEMENT (NAME "zip", e.zip)) AS CLOB(7200)) AS CINFO FROM customer e where cid=1000 |
下面是用来查询 xml(标准化越来越近了) 数据的新的 SQL/xml(标准化越来越近了) 函数和谓词:
xml(标准化越来越近了)TABLE 提供了从 xml(标准化越来越近了) 文档发布关系数据的标准方式。它查询 xml(标准化越来越近了) 值并返回一个关系结果集(将 xml(标准化越来越近了) 数据分解为关系形式)。创建一个虚拟表作为分解的结果,可以使用 SQL insert 语句将这个表插入现有的 SQL 表。
xml(标准化越来越近了)TABLE 允许指定生成的关系的形态(列的数量和数据类型)。XQuery 参数决定行实例和每列的值的生成。
图 4. xml(标准化越来越近了)TABLE 查询
图 4 所示的查询接受输入的 xml(标准化越来越近了) 文档(product)并从其中分解出 @pid 和根节点。然后将这些存储进 xml(标准化越来越近了)PRODUCT 表中。
表 2. 带注释的 xml(标准化越来越近了) 模式分解和 xml(标准化越来越近了)TABLE 之间的差异
带注释的 xml(标准化越来越近了) 模式分解 | xml(标准化越来越近了)TABLE(SQl/xml(标准化越来越近了)) | |
类型映射 | 静态映射信息在 xml(标准化越来越近了) 模式中注释并在注册时启用,不需要在运行时向应用程序公开(隐式)。 | 动态映射信息作为 SQL 查询的一部分。实际上,映射在运行时显式地定义并向应用程序公开。 |
xml(标准化越来越近了) 模式 | 需要一个 xml(标准化越来越近了) 模式,而且这个 xml(标准化越来越近了) 模式必须在 XSR 中注册。 | 不需要一个 xml(标准化越来越近了) 模式。 |
目标关系表必须存在? | 是的。 | 在运行时创建虚拟表。 |
支持多个表? | 是的。一个 xml(标准化越来越近了) 文档可以映射到多个关系表。 | 不行。只能创建一个可以在 SQL 语句中引用的虚拟表。 |
xml(标准化越来越近了)QUERY 是一个 SQL/xml(标准化越来越近了) 发布(伪)函数,它的用途是计算一个 XQuery 表达式并向应用程序返回一个 xml(标准化越来越近了) 值,这个值可以是包含零个或更多项的 XQuery 序列。
图 5. xml(标准化越来越近了)QUERY 查询
图 5 所示的查询只返回 xml(标准化越来越近了)PRODUCT 表中每一行的 DESCRIPTION 列中存储的 xml(标准化越来越近了) 数据的一些元素。
xml(标准化越来越近了)EXISTS
xml(标准化越来越近了)EXISTS 谓词使用 XQuery 查询一个 SQL/xml(标准化越来越近了) 值。如果查询返回非空的序列,那么函数返回 true;否则返回 false。
图 6. xml(标准化越来越近了)EXISTS 查询
DB2 Viper 的 xml(标准化越来越近了) 支持对基于 xml(标准化越来越近了) 的应用程序的影响
应用程序的设计会受到 xml(标准化越来越近了) 数据的存储模型(原样或分解)的影响。存储模型受到存储、查询和修改 xml(标准化越来越近了) 数据方面的功能限制和任何性能需求的影响。随着新功能的引入,DB2 xml(标准化越来越近了) Extenders 的许多限制已经被消除了,因此 xml(标准化越来越近了) 存储模型可以改变了。
本文的其余部分详细描述处理 xml(标准化越来越近了) 数据的 DB2 功能之间的差异。还讨论如何将现有的应用程序迁移到 DB2 Viper 以便使用新的特性集。
设置数据库
您可能会注意到,为数据库设置 xml(标准化越来越近了) 支持所需的一些步骤已经改变了。
表 3. DB2 V8.x 和 DB2 Viper 数据库设置之间的差异
DB2 UDB Version 8.x | DB2 Viper | |
创建数据库 | 也支持非 UTF-8 数据库使用 xml(标准化越来越近了) 数据。 为创建数据库,发出 create db migrate 命令。 | 只支持 UTF-8 数据库使用 xml(标准化越来越近了) 数据。 为创建 UTF-8 数据库,发出 create db migrate using codeset utf-8 territory us 命令。 |
为数据库启用 xml(标准化越来越近了) | 需要通过发出 dxxadm enable_db migrate 命令为每个数据库启用 xml(标准化越来越近了) Extender 支持。 | xml(标准化越来越近了) 支持是 UTF-8 数据库固有的功能。 |
安装进行验证所需的任何 DTD 或 xml(标准化越来越近了) 模式 | 用来进行验证的所有 xml(标准化越来越近了) 模式位于文件系统中,不进行注册。 用来进行验证的任何 DTD 需要注册并存储在数据库的特殊表 DTD_REF 中。 | 用来进行验证的所有 xml(标准化越来越近了) 模式需要注册在 XSR 中。 DTD 不能用于验证,所以在大多数情况下 DTD 必须改为 xml(标准化越来越近了) 模式(仍然可以将它们注册在 XSR 中,因为它们可以用于实体引用和默认值)。 |
创建 xml(标准化越来越近了) 到关系数据的映射 | 原样存储(xml(标准化越来越近了) 作为 xml(标准化越来越近了) CLOB 存储在一个列中)和分解存储(xml(标准化越来越近了) 中的数据分解存储到关系表中)都需要 xml(标准化越来越近了) 到关系数据的映射。 使用专用的映射形式,DAD。 | 只有分解存储需要 xml(标准化越来越近了) 到关系数据的映射。使用更标准且高效的映射技术,带注释的 xml(标准化越来越近了) 模式映射。 |
注册并启用映射 | 存储原样 xml(标准化越来越近了) 的 xml(标准化越来越近了) 列需要使用 DAD 映射来启用,从而创建更新与此列相关联的副表所需的触发器。启用 xml(标准化越来越近了) 列的命令是:db2xml(标准化越来越近了).dxxEnableColumn。 DAD 映射定义如何将 xml(标准化越来越近了) 文档分解为关系表集合(xml(标准化越来越近了) 集合),可以注册 DAD 映射并允许在 xml(标准化越来越近了) Extender 分解函数中使用。启用 xml(标准化越来越近了) 集合的命令是:db2xml(标准化越来越近了).dxxEnableCollection。 | xml(标准化越来越近了) 类型的列(存储本机 xml(标准化越来越近了) 数据)没有任何相关联的映射,不需要启用。 带注释的 xml(标准化越来越近了) 模式定义如何将 xml(标准化越来越近了) 文档分解为关系表,需要将它们注册在 XSR 中并启用分解。这可以在注册时进行: COMPLETE xml(标准化越来越近了) SCHEMA PRODSCHEMA ENABLE DECOMPSITION 也可以在已经注册 xml(标准化越来越近了) 模式之后启用: ALTER XSROBJECT PRODSCHEMA ENABLE DECOMPOSITION |
在 xml(标准化越来越近了) 文档上创建索引 | 对于 xml(标准化越来越近了) 列中的原样文档,可以建立间接索引,办法是:将 xml(标准化越来越近了) 文档中的部分数据分解到辅助(副)关系表中,然后为这些表创建索引,从而对分解的数据进行快速搜索。 注意: 实际上,这些映射定义 xml(标准化越来越近了) 列上的模式种类,如果输入文档的形态改变了,那么需要修改映射信息和副表。 | 以本机方式存储在 xml(标准化越来越近了) 列中的 xml(标准化越来越近了) 文档可以建立 xml(标准化越来越近了) 索引。这些索引直接定位经过解析的树中的存储节点(而不是文档)。这种 xml(标准化越来越近了) 索引是 DB2 Viper 中引入的新概念。 注意: 因为索引不与任何模式或映射相关联,如果模式改变了,那么可以定义新索引,而不必删除现有索引。 |
- 创建数据库并启用 xml(标准化越来越近了) 支持。
DB2 Version 8.xdb2 create db MIGRATE
dxxadm ENABLE_DB MIGRATE
DB2 Viperdb2 create db MIGRATE using codeset utf-8 territory us - 注册 DTD/xml(标准化越来越近了) 模式
DB2 Version 8.x。只能注册 DTD。insert into db2xml(标准化越来越近了).dtd_ref (dtdid, content, usage_count, author,
creator, updator) values ( 'customerdtd', db2xml(标准化越来越近了).xml(标准化越来越近了)CLOBFromFile(
'/home2/hardeep/migrate/customer.dtd'), 0, 'xml(标准化越来越近了)', 'xml(标准化越来越近了)', 'xml(标准化越来越近了)');
DB2 Viper。只能使用 xml(标准化越来越近了) 模式进行验证。db2 register xml(标准化越来越近了)schema http://migrate.db2 from
/home2/hardeep/migrate/customer.xsd as migrate.customer
db2 complete xml(标准化越来越近了)schema migrate.customer - 创建表和存储 xml(标准化越来越近了) 数据的列
DB2 Version 8.x。使用 xml(标准化越来越近了) Extender 数据类型 xml(标准化越来越近了)CLOB。CREATE TABLE PurchaseOrder ( POid BIGINT NOT NULL Prima(最完善的虚拟主机管理系统)RY KEY,
Info DB2xml(标准化越来越近了).xml(标准化越来越近了)CLOB)
注意: 列的类型可以是 xml(标准化越来越近了)CLOB、xml(标准化越来越近了)VARCHAR 和 xml(标准化越来越近了) FILE。
DB2 Viper。xml(标准化越来越近了) 类型的列。CREATE TABLE PurchaseOrder ( POid BIGINT NOT NULL Prima(最完善的虚拟主机管理系统)RY KEY,
Info xml(标准化越来越近了))
注意: 与 xml(标准化越来越近了)CLOB、xml(标准化越来越近了)VARCHAR 和 xml(标准化越来越近了) FILE 不同,xml(标准化越来越近了) 类型是一个标准的 SQL 类型。 - 在 xml(标准化越来越近了) 数据上创建索引。
DB2 Version 8.x。创建 DAD 映射并启用 xml(标准化越来越近了) 列以便在副表上创建间接索引。dxxadm enable_column migrate purchaseorder info
"/home2/hardeep/migrate/po.dad" -r poid
DB2 Viper。使用 xml(标准化越来越近了)pattern 创建 xml(标准化越来越近了) 索引。create unique index order_key on purchaseorder (info) generate key
using xml(标准化越来越近了)pattern '/purchaseOrder/@poid' as sql double; - 创建将输入的 xml(标准化越来越近了) 分解为关系数据的映射
DB2 Version 8.x。创建 DAD 映射并启用 xml(标准化越来越近了) 集合。dxxadm enable_collection migrate customerinfo
/home2/hardeep/migrate/customer.dad
DB2 Viper。对 xml(标准化越来越近了) 模式进行注释并启用它。db2 register xml(标准化越来越近了)schema http://migrate.db2 from
/home2/hardeep/migrate/customer.xsd as migrate.customer
db2 complete xml(标准化越来越近了)schema migrate.customer ENABLE DECOMPOSITION
将现有的 xml(标准化越来越近了) 数据库从 DB2 Version 8.x 迁移到 DB2 Viper
既然对数据库设置方式的差异有了一些理解,就来看看将现有的 xml(标准化越来越近了) 数据库从 DB2 Version 8.x 迁移到 DB2 Viper 所需的基本步骤。
为 DB2 Viper 创建新的 UTF-8 数据库
首先需要理解的是,因为只支持对 xml(标准化越来越近了) 数据使用 UTF-8 编码,所以如果现有的数据库是非 UTF-8 的,那么需要用 UTF-8 编码页集创建一个新数据库。
使用以下命令创建新数据库:
db2 create db migrate using codeset utf-8 territory us |
本文提供了一个迁移实用程序。它可以帮助您生成迁移数据库对象所需的一些数据定义语言(DDL)脚本。
迁移 DTD 和 xml(标准化越来越近了) 模式
因为 DB2 Viper 不使用 DTD 进行 xml(标准化越来越近了) 验证,所以必须将当前 xml(标准化越来越近了) 应用程序使用的任何 DTD 转换为 xml(标准化越来越近了) 模式。为此,首先需要将 DTD 从现有的 DB2 Version 8.x 数据库(DTD_REF 表)装载到本地文件系统中。
select db2xml(标准化越来越近了).xml(标准化越来越近了)FileFromCLOB(db2xml(标准化越来越近了).clob(content), '/home2/hardeep/migrate/customer.dtd') from db2xml(标准化越来越近了).dtd_ref where DTDID='customerdtd'; |
将 DTD 从 DTD_REF 表复制到文件系统之后,需要将它转换为 xml(标准化越来越近了) 模式。有许多免费的基于 Web 的 xml(标准化越来越近了) 实用工具可以帮助您在 DTD 和 xml(标准化越来越近了) 模式之间进行转换(使用关键词 DTD Schema convert 进行搜索)。
注册 xml(标准化越来越近了) 模式
为了使用 xml(标准化越来越近了) 模式验证 xml(标准化越来越近了) 文档,首先需要在 xml(标准化越来越近了) 模式存储库中注册它们。
db2 register xml(标准化越来越近了)schema http://migrate.db2 from /home2/hardeep/migrate/po.xsd as migrate.po db2 complete xml(标准化越来越近了)schema migrate.po |
db2 update db cfg using applheapsz 1000 |
在 DB2 Version 8.x 中,为了存储原样的 xml(标准化越来越近了) 文档,列的类型可以是 CLOB、BLOB、VARCHAR 或 xml(标准化越来越近了) Extender 类型 DB2xml(标准化越来越近了).xml(标准化越来越近了)CLOB、DB2xml(标准化越来越近了).xml(标准化越来越近了)VARCHAR 或 DB2xml(标准化越来越近了).xml(标准化越来越近了)FILE。对于 DB2 Viper,列类型是 xml(标准化越来越近了)。
因此,在 DB2 Version 8.x 中可以用下面的命令创建包含 CLOB 列的表来存储 xml(标准化越来越近了) 数据
CREATE TABLE Product(Pid VARCHAR(10) NOT NULL Prima(最完善的虚拟主机管理系统)RY KEY, Name VARCHAR(128), Category VARCHAR(32),Price DECIMAL(30,2), Info CLOB); |
CREATE TABLE Product(Pid VARCHAR(10) NOT NULL Prima(最完善的虚拟主机管理系统)RY KEY, Name VARCHAR(128), Category VARCHAR(32), Price DECIMAL(30,2), Info xml(标准化越来越近了)); |
CREATE TABLE Product(Pid VARCHAR(10) NOT NULL Prima(最完善的虚拟主机管理系统)RY KEY, Info xml(标准化越来越近了)); |
CREATE TABLE PurchaseOrder(Poid BIGINT NOT NULL Prima(最完善的虚拟主机管理系统)RY KEY, Status VARCHAR(10) NOT NULL WITH DEFAULT 'New', Info DB2xml(标准化越来越近了).xml(标准化越来越近了)CLOB NOT LOGGED NOT COMPACT NOT NULL); |
CREATE TABLE PurchaseOrder(Poid BIGINT NOT NULL Prima(最完善的虚拟主机管理系统)RY KEY, Status VARCHAR(10) NOT NULL WITH DEFAULT 'New', Info xml(标准化越来越近了) NOT NULL); |
在新数据库中创建所有的表之后,下一步是将数据导出原数据库(DB2 Version 8.x)表并导入新数据库(DB2 Viper)表。为了更好地理解这个过程,我们看看 DB2 Viper 的导入实用程序如何处理 xml(标准化越来越近了) 数据。
DB2 IMPORT 实用程序提供了用来自 xml(标准化越来越近了) 文件的数据填充 xml(标准化越来越近了) 列的简便方法。这个实用程序使用一个分界的 ASCII 文件,其中包含的一个参数指定需要导入的每个 xml(标准化越来越近了) 文件。按照约定,这个文件的扩展名是 .DEL。文件中的每一行代表要导入表中的一行数据。如果一行包含 xml(标准化越来越近了) Data Specifier(XDS),那么 IMPORT 读取引用的 xml(标准化越来越近了) 文件中的数据并将其导入 DB2。
从 DB2 Version 8.x 导出 xml(标准化越来越近了) 数据
因为 DB2 Version 8.x 的 EXPORT 实用程序不生成带 XDS 的 .DEL 文件,DB2 Viper 的 IMPORT 实用程序也可以处理 DB2 Version 8.x 的 EXPORT 实用程序为大对象(LOB)创建的 .DEL 文件。
所以,对于 CLOB、BLOB、VARCHAR、DB2xml(标准化越来越近了).xml(标准化越来越近了)CLOB、DB2xml(标准化越来越近了).xml(标准化越来越近了)VARCHAR 或 DB2xml(标准化越来越近了).xml(标准化越来越近了)FILE 类型的列中存储的 xml(标准化越来越近了) 数据,第一步是使用 EXPORT 和 LOB 选项导出包含 xml(标准化越来越近了) 数据的表。
EXPORT TO delfilename, OF DEL LOBS to lobfilespath MODIFIED BY LOBSINFILE select statement |
DB2 EXPORT to C:/temp/migration/export/prod.del of del LOBS to C:/temp/migration/export/lobs modified by LOBSINFILE select pid,name,category,price,Info from product |
注意: 如果从新表中去掉了 name、category 和 price 列,那么应该修改 select 语句,只选择 pid 和 info 列。
这个调用的输出生成一个 prod.del 文件和一个或多个包含 xml(标准化越来越近了) 数据的 lob 文件。
100-100-01,Denim Roll Cuff Crop Pants,pants,+024.89,prod.del.001.lob.0.474/ 100-100-02,Bermuda Shorts,shorts,+09.99,prod.del.001.lob.474.488/ |
DB2 export to C:/temp/migration/export/prod.del of del LOBS to C:/temp/migration/export/lobs modified by LOBSINFILE select pid,name,category,price,cast(Info as clob) from product |
如果没有转换这个列,那么输出会像下面这样:
100-100-01,Denim ,pants,+024.89, 100-100-02,Bermuda ,shorts,+09.99, |
现在可以使用 IMPORT 实用程序将导出的数据导入新数据库中创建的表中。传递 DEL 文件的名称和 LOB 文件的路径。
DB2 IMPORT FROM C:/temp/migration/export/prod.del OF DEL LOBS FROM C:/temp/migration/export/lobs MODIFIED BY xml(标准化越来越近了)CHAR INSERT INTO product; |
迁移 xml(标准化越来越近了) 数据上的索引
在 DB2 Version 8.x 中,xml(标准化越来越近了) 列中存储的 xml(标准化越来越近了) 数据可以利用关系副表建立间接索引。将副表中的值与 xml(标准化越来越近了) 列中的文档关联起来的映射信息在 DAD 文件中定义。
由于 DB2 Viper 能够创建直接定位 xml(标准化越来越近了) 文档内部的路径的 xml(标准化越来越近了) 索引,所以不再需要使用副表来建立间接关系索引。用来创建 xml(标准化越来越近了) 索引的一些关键参数与 DAD 映射中的参数相似。可以使用 DAD 映射中这些参数的值来创建 xml(标准化越来越近了) 索引。现在来分析一个 DAD 映射示例,这个 DAD 映射用来为 DB2xml(标准化越来越近了).xml(标准化越来越近了)CLOB 类型的 purchaseorder 列创建副表。
在 DB2 Viper 中相应的 xml(标准化越来越近了) 索引是:
create index order_name on purchaseorder (info) generate key using xml(标准化越来越近了)pattern '/purchaseOrder/ shipTo/name' as SQL VARCHAR(128); |
另一个重要之处是根 ID,当用这个 DAD 文件在 DB2 Version 8.x 中启用 xml(标准化越来越近了) 列时,这个值传递给 enable_column 调用。
dxxadm enable_column migrate purchaseorder info "/home2/hardeep/migrate/po.dad" -r poid |
所以,当为 DB2 Viper 创建 xml(标准化越来越近了) 索引时,可以在 DB2 Version 8.x 中定义根 ID(主键)的路径上创建惟一索引(如果主键在 xml(标准化越来越近了) 文档中存在的话)。
create unique index order_key on purchaseorder (info) generate key using xml(标准化越来越近了)pattern '/purchaseOrder/@poid' as sql double; |
如果应用程序需要将输入的 xml(标准化越来越近了) 数据分解为关系表,而且您感觉这种需要仍然存在,那么需要将现有的 DAD 映射替换为带注释的 xml(标准化越来越近了) 模式映射。
表 4. xml(标准化越来越近了) 集合和带注释的 xml(标准化越来越近了) 模式之间的差异
xml(标准化越来越近了) 集合 | 新的分解 | |
映射文件 | DAD | 带注释的模式 |
功能和性能 | 有限 | 功能得到了扩展,性能更好 |
DTD/模式 | 不需要。可以注册,也可以不注册。 | 需要。必须注册。 |
因为关于 xml(标准化越来越近了) 文档和关系模式之间关系的映射信息存储在 DAD 文件中,可以利用这些 DAD 文件来了解 xml(标准化越来越近了) 模式所需的注释。要想找到一种可以自动地将 DAD 文件转换为带注释的 xml(标准化越来越近了) 模式的工具,请参考 From DAD to annotated xml(标准化越来越近了) schema decomposition (developerWorks,2006 年 4 月)。
对 xml(标准化越来越近了) 模式进行注释之后,可以在 XSR 中注册并启用它们。
db2 register xml(标准化越来越近了)schema http://migrate.db2 from /home2/hardeep/migrate/customer.xsd as migrate.customer db2 complete xml(标准化越来越近了)schema migrate.customer ENABLE DECOMPOSITION |
本文提供了一个迁移实用程序的示例代码。这个实用程序生成帮助进行数据迁移的脚本。生成的脚本帮助执行以下步骤:
|
迁移命令
Migrate -p[path] -d[database] -s[schema] -t[able] -c[olumn] -[b[ackup]]
|
这个实用程序将脚本文件 migrate_script.db2 写到当前目录。
编译 Java 代码
为编译 Java 代码,需要完成以下步骤:
- 创建目录 /temp/migrate。
- 将 MigrateUtility_code.zip(可以在本文的 下载 一节中找到)复制到 temp 目录。将 Migrate.java 和 xml(标准化越来越近了)Parse.java 解压到 /temp/samples 目录。
- 编译 Java 文件。
在 Microsoft Windows 上: 打开一个 db2 命令窗口。SET CLASSPATH= .;%DB2PATH%\java\db2java.zip;
%DB2PATH%\java\db2jcc.jar;%DB2PATH%\java\db2jcc_license_cu.jar;
"%DB2PATH%\java\jdk\bin\javac.exe" -d . *.java
在 AIX 上: 将 DB2PATH 设置为 DB2 SQLLIB 目录。CLASSPATH=$DB2PATH/java/sqlj.zip:$DB2PATH/java/db2java.zip
$DB2PATH/java/jdk/bin/javac.exe" -d . *.java
注意: 以上命令假设采用 sh 或 bash shell。对于 csh、tsh 和其他 shell,请做适当的修改。 - 运行实用程序。
"%DB2PATH%\java\jdk\jre\bin\java.exe" Migrate -p /temp/migrate
d migrate -s hardeep -t purchaseorder -c info -b xml(标准化越来越近了)extenderdata
CONNECT TO MIGRATE; -- Scripts to backup data to schema- xml(标准化越来越近了)extenderdata CREATE SCHEMA xml(标准化越来越近了)extenderdata; CREATE TABLE "xml(标准化越来越近了)extenderdata"."PURCHASEORDER"( "POID" BIGINT NOT NULL, "STATUS" VARCHAR(10) NOT NULL WITH DEFAULT 'New' , "INFO" "DB2xml(标准化越来越近了)"."xml(标准化越来越近了)CLOB" NOT LOGGED NOT COMPACT NOT NULL) IN "USERSPACE1"; DECLARE bcurs_purchaseorder CURSOR FOR SELECT * FROM hardeep.purchaseorder; LOAD FROM bcurs_purchaseorder OF cursor INSERT INTO xml(标准化越来越近了)extenderdata.purchaseorder; -- Scripts to migrate data export to /temp/migrate purchaseorder/ purchaseorder.del of del lobs to /temp/migrate purchaseorder/lobs modified by LOBSINFILE SELECT * from purchaseorder; drop table purchaseorder; CREATE TABLE purchaseorder ( "POID" BIGINT NOT NULL , "STATUS" VARCHAR(10) NOT NULL WITH DEFAULT 'New' , "INFO" xml(标准化越来越近了) NOT NULL ) IN "USERSPACE1"; import from /temp/migrate/purchaseorder/purchaseorder.del of del lobs from /temp/migrate/purchaseorder/lobs modified by xml(标准化越来越近了)CHAR INSERT INTO purchaseorder; ALTER TABLE purchaseorder ADD Prima(最完善的虚拟主机管理系统)RY KEY ("POID"); -- Scripts to restore data from backup schema- xml(标准化越来越近了)extenderdata schema CONNECT TO MIGRATE; drop table purchaseorder; CREATE TABLE "HARDEEP "."PURCHASEORDER" ( "POID" BIGINT NOT NULL , "STATUS" VARCHAR(10) NOT NULL WITH DEFAULT 'New' , "INFO" "DB2xml(标准化越来越近了)"."xml(标准化越来越近了)CLOB" NOT LOGGED NOT COMPACT NOT NULL ) IN "USERSPACE1"; ALTER TABLE "HARDEEP "."PURCHASEORDER" ADD Prima(最完善的虚拟主机管理系统)RY KEY ("POID"); DECLARE rcurs_purchaseorder CURSOR FOR SELECT * FROM xml(标准化越来越近了)extenderdata.purchaseorder; LOAD FROM rcurs_purchaseorder OF cursor INSERT INTO hardeep.purchaseorder; |
迁移 DB2 查询
DB2 Viper 可以混合使用 SQL/xml(标准化越来越近了) 和 XQuery 同时查询关系数据和 xml(标准化越来越近了) 数据。
由于原来对 xml(标准化越来越近了) 文档进行分解的一些原因已经不存在了(比如使用关系列进行快速搜索),存储 xml(标准化越来越近了) 数据所需的关系模式可以大大简化。因此,应用程序中处理 xml(标准化越来越近了) 数据的代码现在可以由 DB2 查询来替换,可以使用 SQL/xml(标准化越来越近了) 和 XQuery 在数据库服务器中提供同样的功能。这对应用程序处理 xml(标准化越来越近了) 数据的方式的影响是非常惊人的:
- SQL 查询中嵌入的业务逻辑现在独立于应用程序环境。另外,使用 SQL/xml(标准化越来越近了) 或 XQuery 编写的业务逻辑可以存储在视图或存储过程中,可供重用。
- 中间层更简洁、更容易管理。
- 数据库变成一个数据和服务提供者,从而简化了面向服务的体系结构(SOA)。
- 数据在经过充分过滤之后才会离开数据库,这会减少数据库和应用程序之间的通信量。
表 5. 受影响的应用程序
DB2 UDB Version 8.x | DB2 Viper | |
插入 | 将 xml(标准化越来越近了) 文档存储到 DB2xml(标准化越来越近了) 列中的插入调用与存储 CLOB 的插入调用相似: insert into customer (info) values (?) 需要分解为关系表的 xml(标准化越来越近了) 文档使用 xml(标准化越来越近了) Extender 分解函数: dxxInsertxml(标准化越来越近了),dxxShredxml(标准化越来越近了) | 插入调用仍然是一样的,除非文档需要进行验证。xml(标准化越来越近了) 模式验证调用需要显式地添加到 insert 语句中。 insert into customer (info) values (xml(标准化越来越近了)Validate(?)) 需要分解为关系表的 xml(标准化越来越近了) 文档使用带注释的 xml(标准化越来越近了) 模式 decompose 函数或 SQL/xml(标准化越来越近了) xml(标准化越来越近了)TABLE 函数。 |
更新 | 对于原样存储的 xml(标准化越来越近了) 文档(比如 xml(标准化越来越近了)Clob 类型的列),可以使用 xml(标准化越来越近了) Extender UDF db2xml(标准化越来越近了).update 进行子文档更新。 这个 UDF 还同步更新对应的副表。 | 对于原样存储的 xml(标准化越来越近了) 文档(比如 xml(标准化越来越近了) 类型的列),没有开箱即用的子文档更新函数。 可以在本系列的第一篇文章 Partial updates to xml(标准化越来越近了) documents in DB2 Viper (developerWorks,2006 年 5 月)中找到一个用于子文档更新的 Java 存储过程。 DB2xml(标准化越来越近了)FUNCTIONS.xml(标准化越来越近了)UPDATE |
查询 | 对于利用副表存储在 xml(标准化越来越近了) Extender 列中的 xml(标准化越来越近了) 文档,可以使用许多 xml(标准化越来越近了) Extender 提取函数来获得子文档数据。 | 对于存储在 xml(标准化越来越近了) 列中的 xml(标准化越来越近了) 文档,可以使用 XQuery 查询 xml(标准化越来越近了) 文档的内部。有许多支持 XQuery 的 SQL/xml(标准化越来越近了) 函数:
|
发布 | 原样存储的 xml(标准化越来越近了) 文档可以使用 XSLT UDF 进行转换,或者使用 xml(标准化越来越近了)SERALIZE 或 xml(标准化越来越近了)2CLOB 进行串行化。 可以使用 DAD 映射和 xml(标准化越来越近了) Extender 发布 UDF,或者使用 SQL/xml(标准化越来越近了) 发布函数将分解的 xml(标准化越来越近了) 数据发布为 xml(标准化越来越近了)。 | xml(标准化越来越近了) 列中原样存储的 xml(标准化越来越近了) 文档可以使用 XQuery 进行发布和转换,或者使用 xml(标准化越来越近了)SERIALIZE 串行化成 SQL 字符串。 对于分解的 xml(标准化越来越近了) 数据,需要在查询中使用 SQL/xml(标准化越来越近了) 发布函数。 |
单一列中原样存储的 xml(标准化越来越近了)
如果 xml(标准化越来越近了) 数据原样存储在现有的应用程序中,那么对于处理 xml(标准化越来越近了) 数据插入的应用程序代码和 DB2 查询应该没有重大影响。
DB2 Version 8.x。将数据存储到 CLOB、VARCHAR、xml(标准化越来越近了)CLOB 或 xml(标准化越来越近了)VARCHAR 列中:
insert into customer (info) values (?) |
代码仍然是一样的,除非需要对数据进行解析或验证。
insert into customer (info) values (?) |
insert into customer (info) values (xml(标准化越来越近了)Validate(?)) |
如果需要修改 xml(标准化越来越近了) 文档的默认解析,那么可以在 insert 语句中使用 xml(标准化越来越近了)PARSE 来指定解析选项。
insert into customer (info) values (xml(标准化越来越近了)PARSE(DOCUMENT cast(? as BLOB(2M)) preserve whitespace )) |
分解到关系表的 xml(标准化越来越近了)
对于仍然需要分解的 xml(标准化越来越近了) 文档,处理数据插入和分解的查询和应用程序代码的变化很小。
DB2 Version 8.x。使用 xml(标准化越来越近了) Extender 分解函数 dxxInsertxml(标准化越来越近了) 和 dxxShredxml(标准化越来越近了) 进行 xml(标准化越来越近了) 文档分解。
Call dxxShredxml(标准化越来越近了) (?, ?,?,? ); Call dxxInsertxml(标准化越来越近了)(customerdad, ?,?,? ); |
Call xdbDecompxml(标准化越来越近了) (NULL,migrate.customer,?,?,1,NULL,NULL,NULL) |
Insert into product(pid,info) select x.pid, X.doc from xml(标准化越来越近了)TABLE ('$info//product' passing xml(标准化越来越近了)parse( DOCUMENT cast(? as xml(标准化越来越近了)) ) AS "info" COLUMNS PID VARCHAR(12) PATH '@pid', doc xml(标准化越来越近了) by ref PATH '/') as x |
更新 DB2 中存储的 xml(标准化越来越近了) 文档
DB2 Version 8.x xml(标准化越来越近了) Extender 提供了一个 UDF,可以部分更新 DB2 中的 xml(标准化越来越近了) 文档。Update 接受一个位置路径,指定要更新的元素或属性。它返回与被更新列相似的数据类型。xml(标准化越来越近了) 文档中与位置路径匹配的每个元素或属性的内容都更新为提供的值。
Update purchaseorder set status='shipped', info=db2xml(标准化越来越近了).update( info,'/purchaseOrder/@status','shipped') where poid=2001; |
注意: xml(标准化越来越近了) Extender 列上的 update 触发器还更新对应的副表,从而保持 xml(标准化越来越近了) 列中的数据与副表中的数据同步。
DB2 Viper 没有提供任何对数据库中的 xml(标准化越来越近了) 文档进行子元素更新的函数。原因在于 XQuery 标准还没有定义更新的语法,但是已经有一些提案正在接受审议。DB2 不希望在语言中引入只能短期使用的专用函数。
对这个问题的解决方案是一个 Java 存储过程,这个过程可以在文章 Partial updates to xml(标准化越来越近了) documents in DB2 Viper (developerWorks,2006 年 5 月)中找到。这个存储过程可以部分更新 DB2 中的 xml(标准化越来越近了) 文档。更新存储过程还能够删除、替换和追加 xml(标准化越来越近了) 文档中的节点。
注意: 在幕后,这个存储过程进行全文档更新。
Call DB2xml(标准化越来越近了)FUNCTIONS.xml(标准化越来越近了)UPDATE ( ' 'Select info from purchaseorder where poid=2001', 'update purchaseorder set info=? where poid=2001',?,?); |
查询并发布 DB2 中存储的 xml(标准化越来越近了) 文档
处理查询和发布的应用程序代码是受影响最大的代码之一。对于 xml(标准化越来越近了) Extender 列中存储的 xml(标准化越来越近了) 数据,SQL 查询完全变了,因为它们涉及副表,而现在已经不再维护副表了。
以下 SQL 查询两个表,返回有缩略图的产品的细节:
Select SQLPRODUCT.DETAILS, from SQLIMAGES,SQLPRODUCT where SQLPRODUCT.PID=SQLIMAGES.PID and SQLIMAGES.TYPE='thumbnail' |
for $product in db2-fn:xml(标准化越来越近了)column("xml(标准化越来越近了)PRODUCT.DESCRIPTION")/product where $product/description/images/image/@type="thumbnail" return $product/description/details/text() |
提取并查询 xml(标准化越来越近了) 文档中的 xml(标准化越来越近了) 数据
DB2 xml(标准化越来越近了) Extender extract UDF 提供了许多从 xml(标准化越来越近了) 文档中提取数据的标量函数和表函数。任何涉及使用 DB2 extract UDF 从 xml(标准化越来越近了) 文档中提取数据的 SQL 语句也必须替换为对 xml(标准化越来越近了)EXIST、xml(标准化越来越近了)QUERY 或 xml(标准化越来越近了)TABLE 的等效调用。
select db2xml(标准化越来越近了).extractVarchar(info,'/customerinfo/name') from xml(标准化越来越近了)customer |
可以替换为:
Select xml(标准化越来越近了)cast( xml(标准化越来越近了)Query('$cinfo/customerinfo/name' passing info as "cinfo") as varchar(32)) from xml(标准化越来越近了)customer |
select info from customers where db2xml(标准化越来越近了).extractvarchar(info,'/customerinfo/name')=? |
可以替换为:
select info from xml(标准化越来越近了)customer where xml(标准化越来越近了)Exists(' $cinfo/customerinfo[name=$name]' passing info as "cinfo", cast(? as varchar(32)) as "name") |
DB2 xml(标准化越来越近了) Extender 提供了 ExtractCLOB () 和 ExtractCLOBs () UDF,用于提取 xml(标准化越来越近了) 文档的片段。
select db2xml(标准化越来越近了).extractclob(info,'/customerinfo/addr') as RESULT from customer where cid = ? |
可以替换为:
select x.add from xml(标准化越来越近了)customer, xml(标准化越来越近了)TABLE ('$info//customerinfo' passing info AS "info" COLUMNS add xml(标准化越来越近了) by ref PATH 'addr') as x where cid = ? |
转换和发布 xml(标准化越来越近了) 数据
除了可以用来获得子文档信息的 extraction UDF 之外,DB2 xml(标准化越来越近了) Extender 还提供了用来转换数据库中的 xml(标准化越来越近了) 文档的 XSLT UDF。
DB2 xml(标准化越来越近了) Extender 中定义的两个 XSL UDF 是 XSLTransformToClob() 和 XSLTransformToFile()。
SELECT XSLTransformToClob( info, /temp/xslfilename.xsl) FROM xslcustomers SELECT XSLTransformToClob( info, ?) FROM xslcustomers Pass the XSL as a CLOB at runtime |
尽管 DB2 Viper 的 xml(标准化越来越近了) Extender 支持提供了 XSL UDF,但是没有用于 XSL 转换的内置函数(这意味着,为了使用 XSLT UDF,需要启用数据库的 xml(标准化越来越近了) Extender 支持)。因为,XQuery 在功能上与 XSL 有许多重复的地方,可以结合使用 XQuery 和 SQL/xml(标准化越来越近了) 函数来转换和发布 xml(标准化越来越近了) 文档。
以下查询演示如何使用 XQuery 来查询和转换本机存储的 xml(标准化越来越近了) 文档。这个 XQuery 构造称为 “customer” 的新元素,并向其中添加来自 xml(标准化越来越近了)CUSTOMER 表中与条件(@country=United States)匹配的每个 xml(标准化越来越近了) 文档的 name、address 和 phone 节点。然后,将这些 customer 元素返回到单一根节点 “customerlist” 中。
图 7. 使用 XQuery 来查询和转换本机存储的 xml(标准化越来越近了) 文档
将关系数据转换并发布为 xml(标准化越来越近了)
DB2 xml(标准化越来越近了) Extender DAD 文件和用于集合的存储过程提供了双向映射。可以使用同样的映射进行分解和发布。不幸的是,带注释的 xml(标准化越来越近了) 模式没有提供任何发布功能。所以,进行发布的惟一方法是使用 SQL/xml(标准化越来越近了) 函数。
考虑因素
本节包含在进行迁移时需要考虑到的一些因素。这包括一些限制或最佳实践,可以帮助您在迁移 xml(标准化越来越近了) 应用程序时做出正确的决策。全面的考虑因素列表请参见 DB2 Viper 的文档(Leveraging native xml(标准化越来越近了) support)和 ISV success with DB2 Viper: Prepare your applications, routines, and scripts for migration to DB2 Viper (developerWorks,2006 年 3 月)。
对 xml(标准化越来越近了) 列的限制
下面是对 xml(标准化越来越近了) 列的限制:
|
- xml(标准化越来越近了) 模式
下面是与 xml(标准化越来越近了) 模式相关的考虑因素: - 大型模式需要在应用程序堆中有足够的空间。建议扩大应用程序堆,如下所示:
db2 update db cfg using applheapsz 1000 - 因为没有 xml(标准化越来越近了) 模式与 xml(标准化越来越近了) 列相关联,所以从技术上说可以在单一列中插入来自不同模式的 xml(标准化越来越近了) 文档。
只有满足以下条件,才能将 xml(标准化越来越近了) 索引用于查询谓词:
- 索引包含查询谓词。例如,如果索引的限制性等于或小于谓词。这包括名称空间。
- 查询谓词匹配索引数据类型。
- 在谓词和索引定义中以一致的方式使用 /text()。
- 注释不能用来验证实例文档。
- 大多数 xml(标准化越来越近了) 模式成分都可以有注释。
- 在进行分解时,只查看属于一个预定义名称空间的元素声明、属性声明和全局注释上的注释。
- 涉及递归的 xml(标准化越来越近了) 模式不能用于分解。它在注册时会失败。
- 数据库中不支持引用完整性。
- 验证是可选的,可以用来添加默认值、修改文档或修改分解的结果。
- 带注释的模式不能用来进行发布。
要避免的最大的问题是导致输入文档的编码不同于它的编码声明的编码页转换,或引入替换字符的编码页转换(如果目标编码页无法表示所有输入字符,就会出现这种情况)。
- 强烈建议使用隐式的 xml(标准化越来越近了)PARSE。服务器期望接收 xml(标准化越来越近了) 类型,因此不进行任何编码页转换。
insert into customer (cid, info) values (?,?) - 使用显式的 xml(标准化越来越近了)PARSE 会导致服务器期望接收字符或二进制类型(由 cast 子句决定)。使用 xml(标准化越来越近了)PARSE 并转换到 CLOB 会使文档的编码页转换为服务器上的数据库编码页。这通常是不必要或不合适的。
insert into customer (cid, info) values (?,xml(标准化越来越近了)PARSE(DOCUMENT
cast(? as CLOB(2M)) preserve whitespace )) - 如果需要使用 xml(标准化越来越近了)PARSE 来修改默认的解析选项,那么建议将数据转换为二进制类型而不是字符类型。这会避免编码页转换问题。因为以字节流形式读取输入的 xml(标准化越来越近了) 文件,所以在服务器上和 Java 端都不进行编码页转换。转换到 BLOB 可以防止在服务器上转换文档的编码页。
insert into customer (cid, info) values (?,xml(标准化越来越近了)PARSE(DOCUMENT cast(? as BLOB(2M)) preserve whitespace )) |
xml(标准化越来越近了)VALIDATE
下面是与 xml(标准化越来越近了)VALIDATE 相关的考虑因素:
- 验证的开销很大。
- 不支持针对 DTD 进行验证。
下面是与 xml(标准化越来越近了)QUERY 相关的考虑因素:
- 在纯 XQuery 中不能绑定运行时谓词,但是可以通过 SQL/xml(标准化越来越近了) 函数或谓词(比如 xml(标准化越来越近了)QUERY 、xml(标准化越来越近了)TABLE 和 xml(标准化越来越近了)EXISTS)间接地应用运行时谓词。
- 对于 XQuery 比较,如果基类型是已知的,那么不进行隐式转换,不允许非法比较。
下面是与 xml(标准化越来越近了)EXISTS 相关的考虑因素:
- 在 where 子句中使用 xml(标准化越来越近了)EXISTS 而不是 xml(标准化越来越近了)QUERY。
- 只有在查询的结果是一个空序列时,xml(标准化越来越近了)EXISTS 才会返回 false(这意味着 xml(标准化越来越近了)EXISTS(false) 返回 true,因为这个查询的结果不是一个空序列)。以下查询返回顾客表中的所有行,因为当 customerinfo/name 不是 Hardeep 时,查询返回一个包含 false 值的序列,而不是空序列。
select c.info from xml(标准化越来越近了)customer c where xml(标准化越来越近了)exists('
$i/customerinfo/name = "Hardeep" ' passing c.info as "i") - 在 xml(标准化越来越近了)EXISTS 谓词中使用方括号 []。如果将名称检查放在方括号中,那么前面的查询就会正常工作了,因为对于名称不是 Hardeep 的所有 customerinfo,查询现在返回空序列,xml(标准化越来越近了)EXISTS 返回 false。
select c.info from xml(标准化越来越近了)customer c where xml(标准化越来越近了)exists('
$i/customerinfo[name = "Hardeep"] ' passing c.info as "i") - 将多个 xml(标准化越来越近了) 谓词组合在一个 xml(标准化越来越近了)EXISTS 中。下面两个查询并不是一样的:
select * from customer where xml(标准化越来越近了)exists('
$c/customerinfo[name = Hardeep]) and
xml(标准化越来越近了)exists('$c/customerinfo[phone = 555-555-555] '.)
select * from customer where xml(标准化越来越近了)exists('
$c/customerinfo[name=Hardeep and phone=555-555-555]...)
如果某个文档包含两个 customerinfo 元素,其中之一包含 name=hardeep 和 phone=111-111-111,另一个包含 name=Marja 和 phone=555-555-555,那么第一个查询返回这个文档,而第二个查询不返回它。
- ››db2 对float类型取char后显示科学计数法
- ››DB2中出现SQL1032N错误现象时的解决办法
- ››DB2 锁升级示例
- ››db2诊断系列之---定位锁等待问题
- ››db2 命令选项解释
- ››对比App设计和Web设计:App设计和Web设计相互借鉴
- ››DB2 最佳实践: 使用 DB2 pureXML 管理 XML 数据的...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 基础: 表空间和缓冲池
- ››DB2 XML 编程,第 1 部分: 理解 XML 数据模型
更多精彩
赞助商链接