DB2 9 底子基本(730 测验)认证指南,第 7 局部: XQuery 简介(8)

developerWorks








“混合型” 盘考

您曾经看到了若何编写 XQuery 来检索 XML 文档片段、建树 XML 输出的新方式以及根据在盘考自己指定的前提前往分歧的输出。这些都是盘考 DB2 中存储的 XML 数据的简双设施。

您要晓得,关于 XQuery 要学习的内容远比本教程讨论的多得多。但是,有一个主题是我们不克不及忽略的:若何编写同时网罗 SQL 和 XQuery 表达式的盘考。若是需求让盘考同时根据 XML 和非 XML 列值中缀过滤,那么就需求驾驭这种技术。

由于本教程紧张关注 XQuery 并将它用作顶级语言,以是我们先钻研若何将 SQL 嵌入 XQuery 中。但肯定要留意,也可以给与相反的做法 —— 将 XQuery 嵌入 SQL 中。在本教程末尾,您会看到这种做法的一个冗长示例。但是,关于 SQL/XML 以及若何将 XQuery 嵌入 SQL 中的更多信息,请拜见 参考材料。

将 SQL 嵌入 XQuery 中

要将 SQL 嵌入 XQuery 中,需求哄骗 db2-fn:sqlquery 函数替换 db2-fn:xmlcolumn 函数。db2-fn:sqlquery 函数实行一个 SQL 盘考并只前往选择的数据。通报给 db2-fn:sqlquery 的 SQL 盘考必需只前往 XML 数据;这使 XQuery 可以进一步处置赏罚 SQL 盘考的了局。

我们用一个示例将曾经讨论的很多不雅点连系起来。假定盼愿取得住在 San Jose 的 Gold 客户的全部电子邮件地点。若是一个客户有多个电子邮件地点,那么盼愿这些地点在输出中是同一个记录的构成局部。最初,若是吻合前提的 Gold 客户没有提供电子邮件地点,那么盼愿检索他的邮政地点。编写这样的盘考的一种设施如下:

清单 35. 将 SQL 嵌上钩罗前提逻辑的 XQuery 中

                    
xquery 
for $y in 
db2-fn:sqlquery('select contactinfo from clients where status=''Gold'' ')/Client
where $y/Address/city="San Jose"
return (
     if ($y/email) then <emailList>{$y/email}</emailList>
     else $y/Address   
)


我们过细看看第三行,这里嵌入了一个 SQL 语句。这个 SELECT 语句网罗一个基于 status 列的盘考谓词,将这个 VARCHAR 列的值与字符串 Gold 中缀角力计算。在 SQL 中,这样的字符串要突围在单引号中。固然这个示例看起来仿佛哄骗了双引号,但实际上是在角力计算值前后哄骗了两个单引号(''Gold'')。“额定的” 单引号是本义字符。若是在基于字符串的盘考谓词外哄骗双引号替换单引号,就会出现语法错误。

这个盘考的输出是:

清单 36. 盘考输出

                    
<emailList>
	<email>
		love2shop@yahoo.com
	</email>
<Address>
	<street>
		1204 Meridian Ave.
	</street>
	<apt>	4A
	</apt>
	<city>
		San Jose
	</city>
	<state>
		CA
	</state>
	<zip>
		95124
	</zip>
</Address>


将 XQuery 嵌入 SQL 中

肯定要留意,也可以将 XQuery 嵌入 SQL 中。实际上,DB2 9 提供了对类型 SQL/XML 函数的撑持,这些函数屡次用来组织以 SQL 为最外层(即顶级)语言的混合型盘考。固然详细讨论 DB2 的 SQL/XML 撑持赶过了本教程的范围,但至少有两个函数值得留意:

XMLExists
批准导航到 XML 文档中的一个元素(或其他类型的节点)并对特定的前提中缀测试。在 SQL WHERE 子句中指按时,XMLExists 将前往的了局限定为那些网罗餍足指定前提(即指定的前提为 “true”)的 XML 文档的行。您可以猜到了,应该将 XQuery 表达式作为输出通报给 XMLExists 函数,从而导航到文档中感兴趣的节点。
XMLQuery
批准将 XML 放到 SQL/XML 盘考前往的 SQL 了局齐集。它平日用来从 XML 文档中检索一个或多个元素。异常,XMLQuery 函数也以 XQuery 表达式作为输出。


思索以下盘考。这个盘考将 SQL 用作顶级语言并网罗对 XMLQueryXMLExists 函数的挪用:

清单 37. 将 XQuery 途径表达式嵌入 SQL 来获取和限定 XML 数据

                    
select name, status,
xmlquery('$c/Client/phone/home' passing contactinfo as "c") 
from clients 
where xmlexists('$y/Client/Address[zip="95032"]' passing contactinfo as "y")


这个盘考前往的了局集包罗客户姓名、形状和家庭德律风号码列。前两列网罗 SQL VARCHAR 数据,第三列网罗从吻合前提的 XML 文档中提取的一个 XML 元素。我们来过细看看这个盘考的第二行和第四行。

第二行在 SELECT 子句中挪用 XMLQuery,这示意这个函数前往的了局应该作为 SQL 了局齐集的一列。我们指定一个 XQuery 途径表达式作为这个函数的输出,这个表达式让 DB2 导航到 Client 元素上面的 phone 元素的 home 子元素。这个途径表达式引用一个变量($c),这个变量引用 contactinfo 列。

第四行在 SQL WHERE 子句中挪用 XMLExists,这示意 DB2 应该根据一个 XML 谓词对了局中缀限定。这个谓词是在途径表达式中指定的,它示意我们只对具有特定邮政编码的客户感兴趣。异常,作为这个 SQL/XML 函数的输出提供的途径表达式界说一个变量(在这个示例中是 $y),这个变量标识 DB2 将在那里探求 XML 文档(在 contactinfo 列中)。

马虎 示例数据,这个盘考的输出是一个单行的了局集,其值如下:

清单 38. 盘考输出

                    
Lisa Hansen         Silver    <home>4083332222</home>


关于 DB2 的 SQL/XML 撑持的更多信息,拜见 参考材料。




版权声明: 原创作品,批准转载,转载时请务必以超链接方式标明文章 原始情由 、作者信息和本声明。否则将究查执法责任。

原文地址:https://www.cnblogs.com/zgqjymx/p/1972933.html