您所在的位置:数据库 > DB2 > DB2 Version 9.5 pureXML的增强和新特性(3)

DB2 Version 9.5 pureXML的增强和新特性(3)

2009-03-10 10:31 佚名 ITPUB 字号:T | T
一键收藏,随时查看,分享好友!

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

AD:

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 输出

﹤html﹥
﹤head﹥
﹤METAhttp-equiv="Content-Type"content="text/html;charset=UTF-8"﹥
﹤/head﹥
﹤body﹥
﹤tableborder="1"﹥
﹤th﹥
﹤tr﹥
﹤tdwidth="80"﹥productID﹥td﹥
﹤tdwidth="200"﹥productname﹥/td﹥
﹤tdwidth="200"﹥price﹥/td﹥
﹤tdwidth="50"﹥details﹥/td﹥
﹤/tr﹥
﹤/th﹥
﹤tr﹥
﹤td﹥100-201-01﹥/td﹥
﹤td﹥IceScraper,Windshield4inch﹥/td﹥
﹤td﹥3.99﹥/td﹥
﹤td﹥BasicIceScraper4incheswide,foamhandle﹥/td﹥
﹤/tr﹥
﹤/table﹥
﹤/body﹥
﹤/html﹥

用户也可以将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顾问程序和优化器增强

索引顾问程序可以用来获得关于同时为XML和关系数据建立索引的建议。通过同时为XML和关系数据建立索引,用户可以获得良好的性能提升。DB2 9.5优化器使用两种类型的索引来优化查询,并帮助选择最佳的查询执行计划。

DB2 DataWeb服务

使用DataWeb服务,可以将DB2 V9.5XML数据作为数据库manipulation(ML)操作的Web服务公开。DataWeb服务(DES)将ML操作(如插入、更新、选择和存储过程)作为Web服务公开。可以通过Web浏览器、用户客户端使用基于HTTP的SOAP协议(例如POST和GET方法)来访问这些Web服务。通过在现有数据库工具中集成基于Eclipse的工具,可以对DataWeb服务提供支持。

控制中心也经过了更新,以处理XML数据。

结束语

DB2 9将XML作为一个新数据类型引入,而且提供了处理XML值的基础设施。它提供了一些基本功能,比如查询XML文档、注册模式和验证XML文档、使用SQL/XML在SQL和XQuery之间交互。DB2 V9.5增强了现有的功能,并提供了更多函数以有效地处理XML数据。

【编辑推荐】

  1. 用DB2 pureXML执行不区分大小写的高效搜索
  2. PureXML应用之星的发现之旅
  3. 基于pureXML技术的数据库表结构扩展
【责任编辑:浩子 TEL:(010)68476606】

内容导航



分享到:

  1. 因为没有网关,我的服务器被DDoS了
  2. MySQL:第一次看到有人把MySQL主从复制讲解的这么清楚

热点职位

更多>>

热点专题

更多>>

读书

Java for Flash动态网站开发手札
本书深入浅出地说明了如何利用Java、Flash及XML进行Flash富媒体应用程序的开发。 本书知识丰富,内容结构合理,包括:Flash影片

最新热帖

更多>>

51CTO旗下网站

领先的IT技术网站 51CTO 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i 51CTO学院