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″ ﹥ ﹤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数据。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
数据库产品巡礼:IBM DB2概览
IBM DB2关系型数据库管理系统提供了支持多平台系统的关键技术,它具备较高的可用性和良好的性能。
-
如何进行分布式大数据应用调优
分布式环境通常是与数据库服务器相分离的。而DBA的工作就是监视这些环境并配置和优化数据库服务器以满足多种需求。大数据的出现加剧了DBA的问题。
-
IBM DB2将迎来30岁“生日”
再过几天,主流数据库产品DB2就将迎来它30岁的“生日”。作为关系型数据库技术的标志性产品,DB2在过去的30年中也在伴随用户需求的变化不断地发展。
-
SQL调优之“忧”:如何进行SQL调优
DBA们应该将自己从“我要对什么调优?”的老路上解放出来,而在指标、配置和成本方面花费一定的时间。