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