DB2 9 底子根基(730 考验)认证指南,第 7 部门: XQuery 简介(4)

developerWorks








或者的 XML 数据检索操纵

在本节中,将学习若何编写检索整个 XML 文档和 XML 文档的特定部门(即片断)的 XQuery。为此,将运用 XPath 表达式和 FLWOR 表达式。

检索 DB2 中存储的齐备 XML 文档

在作为顶级言语运转时,XQuery 需求一个输入数据的滥觞。在 DB2 中,指定输入数据滥觞的一种步伐是挪用函数 db2-fn:xmlcolumn。这个函数有一个输入参数,这个参数标识用户感兴味的 DB2 表和 XML 列。db2-fn:xmlcolumn 函数前往给定的列中存储的 XML 文档序列。譬喻,以下查问前往包孕客户联结信息的 XML 文档序列:

清单 12. 前往客户联结数据的或者 XQuery

                    
xquery 
db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')


您或者会稀罕,为什么这个查问中指定的表和列名是大大写的。如果回忆一下前面用来创设这个表的 SQL 语句,就会知道表和列名是小写的。除非其余指定,DB2 会在内部编目表中将表和列名转换为大大写。因为 XQuery 是大大小写敏感的,所以小写的表和列名与 DB2 编目中的大大写称号不婚配。

现在,考虑这个 XQuery 的输入。关于拔出 clients 表的 示例数据,清单 12 中查问的输入是 6 个 XML 文档,如下所示。

清单 13. 前一个查问的输入

                    
<?xml version="1.0" encoding="windows-1252" ?>
<Client>
	<Address>
		<street>
			5401 Julio Ave.
		</street>
		<city>
			San Jose
		</city>
		<state>
			CA
		</state>
		<zip>
			95116
		</zip>
	</Address>
	<phone>
		<work>
			4084630000
		</work>
		<home>
			4081111111
		</home>
		<cell>
			4082222222
		</cell>
	</phone>
	<fax>
		4087776666
	</fax>
	<email>
		love2shop@yahoo.com
	</email>
</Client>
<?xml version="1.0" encoding="windows-1252" ?>
<Client>
	<Address>
		<street>
			1204 Meridian Ave.
		</street>
		<apt>
			4A
		</apt>
		<city>
			San Jose
		</city>
		<state>
			CA
		</state>
		<zip>
			95124
		</zip>
	</Address>
	<phone>
		<work>
			4084440000
		</work>
	</phone>
	<fax>
		4085555555
	</fax>
</Client>
<?xml version="1.0" encoding="windows-1252" ?>
<Client>
	<Address>
		<street>
			9407 Los Gatos Blvd.
		</street>
		<city>
			Los Gatos
		</city>
		<state>
			CA
		</state>
		<zip>
			95032
		</zip>
	</Address>
	<phone>
		<home>
			4083332222
		</home>
	</phone>
</Client>
<?xml version="1.0" encoding="windows-1252" ?>
<Client>
	<Address>
		<street>
			501 N. First St.
		</street>
		<city>
			Campbell
		</city>
		<state>
			CA
		</state>
		<zip>
			95041
		</zip>
	</Address>
	<phone>
		<home>
			4081221331
		</home>
		<cell>
			4087799881
		</cell>
	</phone>
	<email>
		golfer12@yahoo.com
	</email>
</Client>
<?xml version="1.0" encoding="windows-1252" ?>
<Client>
	<Address>
		<street>
			1912 Koch Lane
		</street>
		<city>
			San Jose
		</city>
		<state>
			CA
		</state>
		<zip>
			95125
		</zip>
	</Address>
	<phone>
		<cell>
			4085430091
		</cell>
	</phone>
	<email>
		beatlesfan36@hotmail.com
	</email>
	<email>
		lennonfan36@hotmail.com
	</email>
</Client>
<?xml version="1.0" encoding="windows-1252" ?>
<Client>
	<Address>
		<street>
			4209 El Camino Real
		</street>
		<city>
			Mountain View
		</city>
		<state>
			CA
		</state>
		<zip>
			95033
		</zip>
	</Address>
	<phone>
		<home>
			6503310091
		</home>
	</phone>
</Client>


如果您有兴味,还可以运用寻常的 SQL 检索 contactinfo 列中包孕的齐备 XML 文档集。或者的 "select contactinfo from client" 语句就可以或许完成这个任务。

检索特定的 XML 元素

用户常常但愿检索 XML 文档中的特定元素。用 XQuery 完成这个任务很苟且。假定但愿检索全数供给了传真号的客户的传真号。下面是编写这种查问的一种步伐:

清单 14. 检索客户传真号的 FLWOR 表达式

                    
xquery 
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/fax
return $y


第一行指示 DB2 挪用它的 XQuery 理会器。下一行指示 DB2 遍历 CLIENTS.CONTACTINFO 列中包孕的 Client 元素的 fax 子元素。每个 fax 元素顺次绑定到变量 $y。第三行指示关于每次迭代前往 $y 的值。成果是一系列 XML 元素,如下所示。

清单 15. 前一个查问的示例输入

                    
<fax>4087776666</fax>
<fax>4085555555</fax>     


(这里施展阐发的输入经过了简化。XML 版本信息曾经去丧失了,因为它关于本教程并不严正。可是,在 DB2 中运转的 XQuery 都会前往这些信息。示例见 清单 13。)

清单 14 所示的查问也可以表现为一个三步的途径表达式:

清单 16. 检索客户传真号的途径表达式

                    
xquery 
db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/fax


在 XQuery 底子根基 一节中,理解了文本节点。我们在这里运用这一常识。假定不单愿从查问获得 XML 片断,而是获得 XML 元素值的文本表现。为此,可以在 return 子句中挪用 text() 函数:

清单 17. 检索客户传真号的文本表现的两个查问

                    
xquery 
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/fax
return $y/text()
(或)
xquery
db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/fax/text()


这些查问的输入是:

清单 18. 前两个查问的示例输入

                    
4087776666
4085555555


本节中前面的查问的成果相当或者,因为它们都触及 fax 元素,这个元素基于一种原始数据类型。虽然,元素或者基于复杂大的类型,或者包孕子元素(或嵌套的层次结构)。客户联结信息的 Address 元素就是这种元素的例子。考虑以下 XQuery 会前往什么:

清单 19. 检索复杂大 XML 类型的 XQuery

                    
xquery 
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address
return $y
(或) 
xquery
db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address


如果您猜想会前往一系列 XML 片断,此中包孕 Address 元素及其全数子元素,那么您猜对了。下面是输入的摘录:

清单 20. 前面查问的部门输入

                    
<Address>
  <street>5401 Julio Ave.</street>
  <city>San Jose</city>
  <state>CA</state>
  <zip>95116</zip>
</Address>
<Address>
  <street>1204 Meridian Ave.</street>
  <apt>4A</apt>
  <city>San Jose</city>
  <state>CA</state>
  <zip>95124</zip>
</Address>
<Address>
   <street>9407 Los Gatos Blvd.</street>
   <city>Los Gatos</city>
   <state>CA</state>
   <zip>95032</zip>
</Address>
. . .  





版权声明: 原创作品,准许转载,转载时请务必以超链接形式标明文章 原始来由 、作者信息和本声明。不然将追查司法责任。

posted @ 2011-03-07 00:09  蓝色的天空III  阅读(157)  评论(0编辑  收藏  举报