本文描述 IBM® DB2® V9.5 版针对 Linux、Unix 和 Windows 的 pureXML™ 增强和新特性。DB2 Version 9 支持将 XML 作为原生数据类型,也支持 SQL/XML、XQuery 语言,以及其他诸如模式支持、发布函数、对实用工具的 XML 支持、分解等特性。DB2 V9.5 增强了其中的一些特性并引入了新特性,以更加高效地处理 XML。本文从如何使 XML 处理更高效和更易于使用的角度解释了这些增强和新特性。

DB2 9XML支撑概述

DB2 Version 9.5 pureXML的增强和新特性  XML pureXML 第1张

DB2 9引进了原生XML数据类型。它将XML存储为一种通过解析的分层(原生)格局,并答运用户运用XQuery和SQL/XML言语查询数据。DB2XQuery表达式将存储在DB2数据库中的XML文档用作XML的查询源。函数XMLcolumn和sqlquery用来衔接存储在数据库中的XML值,并为XQuery解析器供给XML序列。

除了XQuery言语,DB2 9还供给了SQL/XML函数在单个查询中一同处理XML数据和联系数据。SQL/XML函数xmlquery、xmltable和xmlexists有助于将XQuery嵌入到SQL句子中。

DB2 9还支撑形式验证。它引进了新的指令和存储进程,用于将形式注册到数据库并充任数据库方针。在刺进操作之前或之后,能够用xmlvalidate函数依据已注册的形式验证XML值。也能够对形式进行注释,以便于将XML数据分化为联系表。比方xmlelement、xmlattributes等发布函数可用来将联系值转化为XML文档。DB2 9也针对XML数据支撑对一些实用东西(导入、导出等等)进行了更新。更多关于Version9中的XML支撑请拜见参考资料部分。

DB2 V9.5的新特性

在处理XML数据方面,现有的DB2 9功用十分强壮。DB2 V9.5增强了一些现有特性并引进了其他功用,以使XML处理愈加强壮和高效。下面是本文即将评论的功用列表:

◆支撑在非Unicode数据库中运用XML

◆子文档更新

◆根底表存储/紧缩

◆兼容的XML形式演化

◆验证触发器

◆验证查看束缚

◆XML仿制

◆XML联合

◆XML载入

◆sqlquery()参数

◆用户友爱的发布函数

◆SQL/XML函数的默许参数传递

◆XSLT函数

◆XML分化增强

◆XML索引增强

◆索引参谋程序(Indexadvisor)和优化器增强

◆DB2DataWeb服务

以下末节的大多数代码示例都依据DB2 V9.5示例数据库。能够从DB2 V9.5指令行处理器运转DB2sampl指令来创立示例数据库。也能够通过firststep来创立。firststep是DB2供给的一个东西,在安装了DB2之后就会履行,也能够在今后通过在Windows中挑选Start>AllPrograms>IBMDB2>db2copyname>Setuptools>firststeps来履行。

支撑在非Unicode数据库中运用XML

DB2 9只答运用户运用UTF-8代码页创立包括XML数据的数据库。这意味着,即便XML文档中的值是ASCII格局的,也需求存储到UTF-8格局的数据库中。DB2 V9.5去掉了这个束缚,并且答运用户用恣意代码集创立包括XML列的数据库。由于去掉了这个束缚,即便数据库不是用UTF-8格局创立的,用户也能够更改一个表以增加XML列,或许创立一个包括XML列的新表。

以下代码创立了一个示例数据库和包括一个XML列的示例表:

清单1.运用默许代码页的数据库

db2 CREATE DATABASE sampledb
db2 CONNECT TO sampledb
db2 CREATE TABLE record(id INT, record XML)
子文档更新

DB2 V9.5答运用户更新存储在数据库中的XML文档的一部分。它引进了XQuerytransform表达式,该表达式运用4个更新表达式——insert、delete、replace和rename来修正XML文档片段。transform表达式是XQuery言语的一部分,因而能够用在XQuery表达式中。关于DB2 V9.5,一个transform表达式中只能运用一个更新表达式。一个transform表达式有以下子句:
◆COPY:transform表达式的copy子句将源XML值绑定到一个变量。更新表达式将会在查询中对该副本进行处理。

◆MODIFY:modify子句依据更新表达式修正仿制的XML值。在MODIFY子句中能够运用多个更新表达式。

◆return:return子句回来修正后的值。

下面将解说这4个更新表达式:

1.insert表达式将一个新的XML节点刺进到现有XML文档中。能够在XML文档指定刺进的方位.

2.replace表达式用来更新特定节点的特定值。

3.delete表达式用来从XML文档删去特定节点。

4.rename表达式用来对节点进行重命名。

由于transform表达式是XQuery言语的一部分,因而能够在包括xmlquery函数的SQL句子中运用它,也能够用于更新句子来更新XML值。

清单2中的代码更新了示例数据库中customer表的info列。它更新XML文档以运用cid联系列的值匹配CID特点。

清单2.更新表的transform表达式

UPDATE CUSTOMER
SET info =
XMLQUERY('transform
copy $po := $INFO
modify
do replace value of $po/customerinfo/@Cid with $CID
return $po'
passing info as "INFO", cid as "CID")
WHERE cid=1000

假如在表的XML列上存在XML验证查看束缚,在手动更新或许通过触发器更新之前,用户或许需求验证新的XML值。

以下代码示例从purchaseorder表中删去一个条目,并将修正后的文档作为查询成果。

清单3.transform表达式

xquery
transform
copy
$po := db2-fn:sqlquery(‘select porder from purchaseorder where
custid = 1002 and orderdate=“2006-02-18”’)
modify
do delete $po/ PurchaseOrder/item[partid = “100-201-01”]
return $po

示例xupdate.db2给出了transform表达式的不同比方。能够在sqllib/samples/xml/xquery/clp目录下找到此示例。

根底表行存储/紧缩

在DB2 9中,XML数据和联系数据存储在不同的方位。这个存储方位称作XML数据区域(XMLdataarea,XDA)。DB2 9将一切XML文档存储在这个存储方位,这意味着拜访XML值和联系数据需求更多I/O。假如XML文档较小,并且在存储联系值之后页面巨细仍满足包容XML值,那么将XML存储在相同的页面能够供给不错的功用收益。这些收益包括:

紧缩:由于XML数据和联系数据存储在一同,因而能够运用DB2 9中引进的紧缩技能对XML数据进行紧缩。由于XML值比联系数据大,所以能够取得较高程度的紧缩。

查询功用:由于XML数据和联系数据存储在相同方位,因而直接刺进XML数据使得根底表比一般情况下要大。假如XML数据的拜访频率与表中的其他联系值适当,那么这将进步查询数据的功用。

DB2 V9.5引进了XML数据的根底表行存储。这意味着假如每行的联系数据和XML数据的总巨细没有超越1页面的巨细,这两种数据就能够存储在相同的物理页面。只需当一个记载的总巨细没有超越页面巨细时,才干够对XML数据进行根底表行存储。假如是这样,XML数据就会像一般相同存储在XML存储方位。DB2中答应的页面最大值为32KB,因而一个XML值的最大刺进长度也被束缚到32KB。假如文档的内部树表明的巨细比指定的刺进长度小,它们将会被刺进。清单4中的代码所创立的表能够对XML数据进行根底表行存储:

清单4.XML数据的根底表存储

db2 CREATE TABLE emp1(id INT, info XML INLINE LENGTH 1024)

运用 INLINE 选项指定将 XML 数据跟联系数据存储在一同。这关于要获取的数据都坐落相同方位的查询来说很有利。另一方面,关于拜访非 XML 数据的查询,这或许导致需求更多的 I/O 才干找到联系数据。

#p#

运用 XML 数据根底表行存储的抱负景象是,当表只需一个 XML 类型列并且 XML 文档的最大值没有超越页面巨细时。

兼容的 XML 形式演化

为了增加灵活性并供给更好的形式演化,DB2 V9.5 为 XML 形式引进了 update 特性。曾经注册的形式能够更新为新形式,只需它们相互兼容。假如运用旧形式验证的 XML 文档关于新形式依然有用,那么这两种形式便是兼容的。

例如,新形式中增加的可选元素和旧形式中的元素兼容,这是由于新元素的可选特性使通过旧形式验证的 XML 文档依然有用。新 XML 文档能够具有这个可选元素,并且能够通过新形式的验证。由于旧文档依然有用,所以更新形式之后无需再履行任何操作。假如形式不兼容,形式更新就会失利。旧形式的注释和标识符依然会保存。

为了更新形式,DB2 V9.5 引进了 XSR_UPDATE 存储进程。存储进程查看兼容性,只当新形式具有兼容性时才更新形式。要更新形式,用户需求别离注册新旧形式,然后调用 XSR_UPDATE 存储进程。一旦旧形式通过更新,用户能够挑选保存旧形式或许将其删去。

让我们以 customer 表的 info 列作为一个比方。info 列包括 addr 元素,该元素具有以下界说(在 sqllib/samples/db2sampl 目录下能够找到完好的形式)。

清单 5. 旧 XML 形式界说

﹤xs:element xmlns:xs="http://www.w3.org/2001/XMLSchema"
name="addr" minOccurs="1" maxOccurs="unbounded"﹥
﹤xs:complexType﹥
﹤xs:sequence﹥
﹤xs:element name="street" type="xs:string" minOccurs="1" /﹥
﹤xs:element name="city" type="xs:string" minOccurs="1" /﹥
﹤xs:element name="prov-state" type="xs:string" minOccurs="1" /﹥
﹤xs:element name="pcode-zip" type="xs:string" minOccurs="1" /﹥
﹤/xs:sequence﹥
﹤xs:attribute name="country" type="xs:string" /﹥
﹤/xs:complexType﹥
﹤/xs:element﹥

之后,用户希望具有一个可选的 HouseNo 元素。要更新已注册的形式以使标识符坚持不变,需求先注册包括附加元素的新形式。 新 addr 元素的界说如下:

清单 6. 新 XML 形式界说

﹤xs:element xmlns:xs="http://www.w3.org/2001/XMLSchema"
name="addr" minOccurs="1" maxOccurs="unbounded"﹥
﹤xs:complexType﹥
﹤xs:sequence﹥
﹤xs:element name="HouseNo" type="xs:string" minOccurs="0" /﹥
﹤xs:element name="street" type="xs:string" minOccurs="1" /﹥
﹤xs:element name="city" type="xs:string" minOccurs="1" /﹥
﹤xs:element name="prov-state" type="xs:string" minOccurs="1" /﹥
﹤xs:element name="pcode-zip" type="xs:string" minOccurs="1" /﹥
﹤/xs:sequence﹥
﹤xs:attribute name="country" type="xs:string" /﹥
﹤/xs:complexType﹥
﹤/xs:element﹥

注册之后,能够用以下存储进程将现有形式更新为新形式:

清单7. 运用 XSR_UPDATE 更新形式

db2 call XSR_UPDATE('RSCHEMA','CUSTOMER','RSCHEMA','CUSTOMER1',0)

最终一个参数值0表明更新之后不应该删去新形式。假如该参数设置为其他非零值,在更新操作之后新形式将会被删去。

示例代码xsupdate.db2演示了兼容的XML形式演化。能够在sqllib/samples/xml/clp目录中找到该示例。

验证触发器支撑

为了进步运用程序灵活性并为用户供给对引进的XML文档的主动验证功用,DB2 V9.5扩展了在beforetrigger中对XML的支撑。beforetrigger是运用BEFORE选项创立的触发器,并在inster/update/delete操作之前履行。在beforetrigger中,能够在新变量中引证XML值。触发器的操作能够对新值运用xmlvalidate函数。触发器的WHEN子句能够用来查看是否依据任何指定形式对新值进行了验证。能够运用WHEN条件中的ISVALIDATED或ISNOTVALIDATEDACCORDINGTOXMLSCHEMA子句来完结该操作。依据WHEN条件的输出,或许还需求验证XML值或设置一个新值。现在,只答应将xmlvalidate函数用于XML类型的transition变量。触发器创立之后,在每次履行刺进操作时,将会被主动激活并履行,假如在刺进句子中没有验证XML值,也能够用触发器进行验证。

以下代码是一个DDL句子,用于创立customer表和依据该表界说的触发器。只需存在对表的刺进操作,就会激活触发器。假如没有在刺进句子中对XML文档进行验证,触发器将会在刺进之前运用xmlvalidate函数验证该文档。以下的示例代码假定表的customer不存在,并且已经在数据库中注册了该customer形式。

清单8.为一个表界说的触发器

CREATE TABLE Customer ( Cid        BIGINT NOT NULL,
info XML,
History XML,
CONSTRAINT PK_CUSTOMER PRIMARY KEY (Cid))
CREATE TRIGGER Trigger_customer NO CASCADE BEFORE INSERT ON customer
REFERENCING NEW AS n
FOR EACH ROW MODE db2sql
WHEN (n.info IS NOT VALIDATED ACCORDING TO XMLSCHEMA ID customer)
BEGIN ATOMIC
SET n.info = XMLVALIDATE(n.info ACCORDING TO XMLSCHEMA ID customer);
END@

示例 xmltrig.db2 供给了不同的场景和操作,这些操作用来分配新值并验证 XML 值,能够在触发器内部履行。该示例能够在 sqllib/samples/xml/clp 目录中找到。

XML 验证查看束缚

查看束缚(check constraint)是一类能够在创立表时作用到表列的束缚。只需当束缚合法时,DB2 才答应刺进操作,不然刺进将会失利。

DB2 V9.5 支撑对 XML 值进行查看束缚。用户能够运用查看束缚来加强对 XML 列的验证。与 before trigger 相似,能够在查看束缚中运用 IS VALIDATED ACCORDING TO XMLSCHEMA 子句来加强验证。专一的差异在于,这种束缚只查看验证条件,并不会进行实践的验证。用户能够在刺进句子中运用 xmlvalidate 来显式验证 XML 值,或许运用 before trigger 来履行主动验证。依据查看束缚中指定的形式,只需当 XML 值有用时,才干成功刺进。

对一个表 XML 值运用 before trigger 和查看束缚,往往能够保证 XML 值关于指定形式是有用的。只需履行了刺进操作,before trigger 就会主动进行验证,而查看束缚将会让用户显式地运用 xmlvalidate 函数。这两种办法能够一同运用,以加强 XML 值的完好性。

清单9 中的代码将会修正 清单 8 中创立的表 customer,以对表履行查看束缚:

清单9. 查看束缚

db2 ALTER TABLE customer ADD CONSTRAINT check_info

CHECK(info IS VALIDATED ACCORDING TO XMLSCHEMA ID customer)

上面创立的查看束缚总是会查看是否依据 customer 形式对文档进行了验证。假如没有触发器,用户需求运用 xmlvalidate 函数显式地验证该文档。

示例代码 xmlcheckconstraint.db2 演示了如何为具有相同结构的不同表创立视图,该视图能够进行查看束缚,以及按形式对表进行区别。

XML 仿制支撑

DB2 V9.5 支撑将 XML 数据仿制到其他支撑 XML 数据的数据库。能够运用 WebSphere® Replication Server 9.5 版或许 WebSphere Data Event Publisher 9.5 版来进行仿制。WebSphere Replication Server 能够将 XML 数据仿制到支撑 XML 数据类型的联合方针,也能够将 XML 数据映射到 CLOB/BLOB 列。

像任何其他联系列相同,对 XML 数据的仿制是在业务音讯中完结的,因而仿制的 XML 的巨细将遭到最大业务音讯长度的束缚。假如数据很大,能够在原始文档中刺进一个占位符文档。也能够在例表面中刺进一个破例。

当进行仿制时,不能对 XML 形式注册进行仿制。此外,在仿制进程中也不能对 XML 数据进行验证。

XML 联合支撑

WebSphere Federation Server Version 9.1 支撑 pureXML,因而能够集成本地和长途的 XML 存储数据。能够将来自不同数据库的 XML 数据当作本地数据查看,并且能够用 DB2 XQuery 和 SQL/XML 查询这些数据。能够在长途联合数据库上创立一个视图,以接连字符串的方法查看该数据,这些数据能够在 WebSphere Federation Server 上解析为 XML 值。现在 DB2 能够运用 SQL/XML 和 XQuery 言语通过为视图创立的别号来查询数据。

与验证本地 XML 值的方法相同,能够运用 db2 xmlvalidate 函数验证来自不同联合数据源的 XML 数据。

载入支撑

DB2 9 首要支撑两种用 XML 值填充表的方法。insert 句子向表中刺进 XML 值,import 实用程序用于将很多数据导入表中。

DB2 V9.5 扩展了对 load 实用程序的支撑。load 支撑 import 支撑的大多数 XML 数据选项。能够运用 FROM 子句为 XML 数据指定途径。在 load 期间能够运用 XMLVALIDATE USING 子句对 XML 数据进行验证。load 有 3 个不同的选项:XDS、SCHEMA 和 SCHEMALOCATION HINTS。当指定 XDS 选项时,能够运用 DEFAULT, IGNORE 和 MAP 子句。这些选项的意义与 import 中对应选项的意义相同。能够运用文件类型修正器 XMLCHAR 和 XMLGRAPHIC 指定数据的代码页。XML 数据指定程序(XML data specifier,XDS)在数据文件中指定 XML 值。load 重启的行为和本来相同。它通过扫描一切 XML 文档从头构建一切索引。

示例代码 xmlload.db2 演示了 DB2 V9.5 中可用的 XML 数据载入选项。能够在 sqllib/samples/xml/clp 目录中找到该示例。

#p#

XSLT支撑

DB2 V9.5供给了运用数据库自身的XSL转化来处理XML文档的功用。能够运用XSLT样式表将存储在数据库中的XML文档转化为HTML格局。为此,DB2 V9.5引进了xsltransform函数。该函数还支撑运用参数的样式表。xsltransform函数能够将作为XML文档存储在数据库表列中的XSLT样式表运用到XML文档上。这为用户供给了灵活性,用户能够检索来自数据库的通过转化的XML文档,并能够直接在Web上显现。

现在,假定您已有下面的XML文档:

清单10.XML文档

Ice Scraper, Windshield 4 inch
Basic Ice Scraper 4 inches wide, foam handle
3.99

以及相应的 XSLT 样式表:

清单11. XSLT 样式表

﹤?xml version="1.0" encoding="UTF-8"?﹥﹤xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"﹥
﹤xsl:template match="products"﹥
﹤html﹥
﹤head/﹥
﹤body﹥
﹤table border="1"﹥
﹤th﹥
﹤tr﹥
﹤td width="80"﹥product ID﹤/td﹥
﹤td width="200"﹥product name﹤/td﹥
﹤td width="200"﹥price﹤/td﹥
﹤td width="50"﹥details﹤/td﹥
﹤/tr﹥
﹤/th﹥
﹤xsl:apply-templates/﹥
﹤/table﹥
﹤/body﹥
﹤/html﹥
﹤/xsl:template﹥
﹤xsl:template match="product"﹥
﹤tr﹥
﹤td﹥﹤xsl:value-of select="@pid"/﹥﹤/td﹥
﹤td﹥﹥﹤xsl:value-of select="./description/name"/﹥﹤/td﹥
﹤td﹥﹤xsl:value-of select="./description/price"/﹥﹤/td﹥
﹤td﹥﹤xsl:value-of select="./description/details"/﹥﹤/td﹥
﹤/tr﹥
﹤/xsl:template﹥
﹤/xsl:stylesheet﹥

这些文档需求存储在表中,或许当作参数传递。当将这些值作为参数传递时,请保证它们是格局杰出的XML文档。参数的数据类型能够是XML、VARCHAR、CLOB或BLOB。假定文档和样式表都存储在表中,能够用以下句子转化XML文档:

留意:示例假定存储文档的表称号为xslt,XML文档的列名为xmldoc,XSL文档的列名为xsldoc。

清单12.XSLTransform表达式

SELECT XSLTRANSFORM (description USING stylesheet AS CLOB (10M))
FROM product_details

这个查询输出一个 HTML 文档,能够在浏览器中进行查看。清单 13 显现该 HTML 输出:

清单13. XSLTransform 表达式的 HTML 输出

UPDATE CUSTOMER
SET info =
XMLQUERY('transform
copy $po := $INFO
modify
do replace value of $po/customerinfo/@Cid with $CID
return $po'
passing info as "INFO", cid as "CID")
WHERE cid=10000

用户也能够将XML文档和一个XSLT样式表存储在不同的表中,并且能够通过衔接表将单个XSLT样式表运用到多个XML值。

发布函数

发布函数用来将联系数据转化为XML值。DB2 9引进了SQL/XML支撑,该支撑在DB2 V9.5中得到了增强和简化。一些DB2 9SQL/XML函数,比方xmlelement,需求供给一切XML元素的称号、特点和其他节点,而这些元素来自表的联系列或许被显式地供给。有时用户需求生成XML值,可是不想牵涉到元素称号。

通过引进新函数xmlrow和xmlgroup,DB2 V9.5对现有的发布函数进行了扩展。这些函数从表列取得XML元素的称号和值。xmlrow输出是一个表明为XML的行值的序列,xmlgroup函数将一切值集合到一个根节点下。

下表是一个示例employee表,该表具有职工的具体地址,包括以下记载:

IDNAMESTREETCITYSTATECOUNTRY
1manojsector14gurgaonharyanaindia

下面的查询在该行中运用了xmlrow和xmlgroup函数。

清单14.新发布函数

db2SELECTXMLROW(id,name,street,city,state,country)FROMEMPLOYEE
1
manoj
sector14
gurgaon
haryana
india
db2SELECTXMLGROUP(id,name,street,city,state,country)FROMEMPLOYEE
1
manoj
sector14
gurgaon
haryana
india

在DB2 9中,为了得到相同成果,除了显式地供给元素称号,还需求将xmlelement运用到每个列值。

跟V91版别中相同的查询比较,示例代码xmlintegrate.db2为这些函数供给了更多杂乱比方。能够在sqllib/samples/xml/clp目录下找到该示例。

将参数传递给sqlquery函数

在DB2 9中,sqlquery函数将一个SQL句子嵌入到XQuery表达式中。此函数将一个字符串值作为输入,该字符串是一个有用的SQL全挑选句子。在DB2 9中,不能将参数从XQuery句子传递给此函数。

DB2 V9.5增强了该函数,引进了一个新的parameter函数,该函数将一个整数值作为输入。现在,sqlquery函数能够将多个参数作为输入,第一个参数是一个表明全挑选的字符串,这今后是参数的值。sqlquery函数的第一个字符串参数能够包括parameter函数,该函数将会被传递给sqlquery函数的参数代替,该参数坐落第一个必需的字符串参数之后。传递给parameter函数的整数值表明在调用sqlquery函数中参数的方位,该参数将会在调用中被代替。例如,parameter(1)告知解析器用字符串参数后的第一个参数代替这个值。参数的类型应该和全挑选所希望的值类型相同。能够运用类型转化函数将值转化为一个适宜的类型。

让我们以示例数据库中的customer表作为比方。能够通过运转db2sampl指令和从firststep创立示例数据库。firststep是DB2供给的一个东西,在安装了DB2之后就会履行,也能够在今后通过在Windows中挑选Start>AllPrograms>IBMDB2>db2copyname>Setuptools>firststeps来履行。

customer表包括一个作为联系列的cid列,以及表明顾客id的键值。infoXML列具有一个特点Cid,该特点也表明顾客id。假如数据是共同的,那么特点Cid值应该与特定行的cid列值相同。以下的查询将查看数据坚持共同的行的数量。Cid特点的值被传递给sqlquery函数,以将其与联系cid值进行比较。

清单15.将参数传递给sqlquery函数

xquerydeclaredefaultelementnamespace"http://posample.org";
for$iindb2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo/@Cid
for$jindb2-fn:sqlquery("selectinfofromcustomerwherecid=parameter(1)",$i)
return
{$i}

此查询回来一切数据共同的顾客id。

示例代码xqueryparam.db2供给了一些不错的比方,将一个和多个参数传递给sqlquery函数。能够在sqllib/samples/xml/clp目录中找到该示例。

现有函数XMLQuery、XMLtable和XMLExists的默许传递行为

在DB2 9中,函数xmlquery、xmltable和xmlexists用来将Xquery句子嵌入到SQL句子中。运用这些函数的PASSING子句将参数从SQL句子传递给这些函数。

在DB2 9中,假如同一个SQL句子中的这些函数会履行屡次,那么每次履行都需求一个独立的PASSING子句。有时这会使查询的结构看起来很杂乱和巨大。DB2 V9.5扩展了这些函数,以运用默许的传递机制。现在,将一个列称号用作这些函数的Xquery中的一个变量名。假如没有运用显式的PASSING子句,默许情况下DB2将传递相同列给一个变量。这使查询更精简并更易于了解。以下代码给出了一个针对示例数据库表的比方。查询为名为RobertShoemaker的顾客获取purchaseorder中的第一项。

清单16.SQL/XML函数的默许传递行为

SELECTXMLQUERY('declaredefaultelementnamespace"http://posample.org";
$PORDER/PurchaseOrder/item[1]')
FROMpurchaseorderASp,customerASc
WHEREXMLEXISTS('declaredefaultelementnamespace"http://posample.org";
$INFO/customerinfo[name="RobertShoemaker"and@Cid=$CUSTID]')

关于SELECT子句中的xmlquery函数,默许情况下传递purchaseorder表的porder列。同样地,关于xmlexists函数,默许情况下传递customer表的info列和custid列。请保证以大写字母的方法运用这些变量的称号,由于xquery是一个区别巨细写的言语,并且联系列称号常常以大写的方法存储。

XML验证束缚

DB2 V9.5增强了SELCT句子运用的ISVALIDATED子句,以包括ACCORDINGTOXMLSCHEMAID。现在用户能够供给多个形式并仅挑选针对这些形式验证的XML值。DB2 V9.5能够将任何XML表达式(而不是一列)作为一个操作数,这具有很大的灵活性。下面的比方只挑选了customer表顶用customer形式验证之后的文档。

清单17.SELECT句子中的XML验证束缚

db2SELECTinfoFROMcustomer
WHEREinfoISVALIDATEDACCORDINGTOXMLSCHEMAIDcustomer

通过注释的XML形式分化

DB2 9支撑XML形式的注释,因而除递归形式外,能够将数据分化为联系表。DB2 V9.5解除了这个束缚,现在即便形式是递归的,用户也能够对数据进行注释和分化。

DB2 V9.5扩展了分化,以供给刺进次序。当将数据分化成多个具有外键联系的表时,这特别重要。在这种情况下,应该首要填充主表,以坚持引证束缚。能够运用以下注释指定刺进次序:

清单18.对形式进行注释,以供给刺进次序

CUSTOMER
PURCHASEORDER

示例代码recxmldecomp.db2和xmldecomposition.db2给出了一些不错的比方,其间别离演示了将递归形式和刺进次序进行注释并分化到表中。能够在sqllib/samples/xml/clp目录中找到示例代码。

XML索引增强

DB2 9引进了XML索引。能够在数据库中XML文档的特定节点上创立XML索引。索引的数据类型能够是VARCHAR、DOUBLE、DATE或TIMESTAMP。假如索引的数据类型与XML文档的元素类型不匹配,DB2将刺进XML值,可是不会为该值创立索引。

DB2 V9.5为索引引进了一个附加子句REJECTINVALIDVALUES。假如运用该子句创立索引,并且索引的数据类型与正在刺进的XML文档中元素的数据类型不匹配,刺进将会失利。假如在刺进XML值之后创立索引,并且数据类型不匹配,索引创立也会失利。

关于DB2 V9.5,这种行为是默许的,也能够运用IGNOREINVALIDVALUES子句显式地指定这种行为。

下面的示例将会运用REJECTINVALIDVALUES为customer表的Cid特点创立一个索引。

清单19.XML索引

db2CREATEINDEXindex1ONcustomer(info)
GENERATEKEYUSINGXMLPATTERN
'declaredefaultelementnamespace"http://posample.org";
/customerinfo/@cid'asSQLDOUBLEREJECTINVALIDVALUES

Index参谋

转载请说明出处
知优网 » DB2 Version 9.5 pureXML的增强和新特性

发表评论

您需要后才能发表评论