xquery

您可能已经听到有关DB2 V9的嗡嗡声,DB2 V9是IBM第一个同时支持表格(基于SQL)和分层(基于XML)数据结构的数据库管理系统。 该系列的前几篇文章总结了DB2的新XML功能,描述了如何创建数据库对象并用XML数据填充它们,并解释了如何使用SQL和SQL / XML处理XML数据。 本文将继续关注DB2 XML对XQuery的新支持,以探索其功能。

DB2将XQuery视为一流的语言,允许用户直接编写XQuery表达式,而无需要求用户将XQueries嵌入或包装在SQL语句中。 此外,DB2的查询引擎本机处理XQueries,这意味着它可以解析,评估和优化XQueries,而无需在后台将它们转换为SQL。 当然,如果您选择编写同时包含XQuery和SQL表达式的双语查询,DB2也将处理和优化这些查询。

与本系列第3部分中的 SQL / XML一样,本文探索了一些常见的查询任务,并探讨了如何使用XQuery来实现目标。 首先,简要考虑XQuery与SQL的区别。

关于XQuery

XQuery在许多关键方面与SQL有所不同,主要是因为这些语言旨在与具有不同特征的不同数据模型一起使用。 XML文档包含层次结构并具有固有顺序。 基于SQL的DBMS支持的表格数据结构是平面的和基于集合的。 这样,行是无序的。

这些数据模型之间的差异在其各自的查询语言中产生了许多基本差异,包括:

  • XQuery支持路径表达式,以使程序员能够浏览XML的层次结构,而普通SQL(无XML扩展名)则不行。
  • XQuery支持类型化和非类型化数据,而SQL数据始终使用特定类型定义。
  • XQuery缺少空值,因为XML文档忽略了丢失或未知的数据。 当然,SQL使用空值来表示丢失或未知的数据值。
  • XQuery返回XML数据序列,而SQL返回各种SQL数据类型的结果集。

这是XQuery和SQL之间基本差异的子集。 提供详尽的列表超出了本介绍性文章的范围,但是IBM Systems Journal文章更详细地讨论了语言差异。 本文重点介绍XQuery语言的一些基本方面以及如何在DB2 V9中使用它来查询XML数据。

样本数据库

本文中的查询访问本系列第1部分中创建的示例表。 为了快速查看,清单1定义了示例项目和客户表。

清单1.表定义
create table items (
id      int primary key not null,
brandname   varchar(30),
itemname    varchar(30),
sku         int,
srp         decimal(7,2),
comments    xml
)create table clients(
id      int primary key not null,
name        varchar(50),
status      varchar(10),
contactinfo     xml
)

清单2中显示了items.comments列中包含的示例XML数据, 清单3中显示了clients.contactinfo列中包含的XML示例数据。 后续查询示例将引用这些XML文档之一或全部中的特定元素。

清单2.存储在Items表的Comments列中的示例XML文档
<Comments><Comment><CommentID>133</CommentID><ProductID>3926</ProductID><CustomerID>8877</CustomerID><Message>Heels on shoes wear out too quickly.</Message><ResponseRequested>No</ResponseRequested></Comment><Comment><CommentID>514</CommentID><ProductID>3926</ProductID><CustomerID>3227</CustomerID><Message>Where can I find a supplier in San Jose?</Message><ResponseRequested>Yes</ResponseRequested></Comment>
</Comments>
清单3.存储在Clients表的Contactinfo列中的示例XML文档
<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>

查询环境

本文中的所有查询都旨在以交互方式发出。 您可以通过DB2命令行处理器或DB2控制中心的DB2命令编辑器来执行此操作。 本文中的屏幕图像和说明主要针对后者。 (IBM Data Studio和IBM Optim Development Studio附带了一个基于Eclipse的Developer Workbench,它可以帮助程序员以图形方式构造查询。本文不讨论应用程序开发问题或Development Studio。)

要使用DB2 Command Editor,请启动Control Center,然后选择Tools> Command Editor 。 出现类似于图1的窗口。

图1. DB2命令编辑器,可以从DB2控制中心启动

在上部窗格中键入查询,单击左上角的绿色箭头以运行它们,然后在下部窗格或单独的“查询结果”选项卡中查看输出。

XQuery示例

就像本系列的第3部分一样 ,本文逐步介绍了几种常见的业务场景,并展示了如何使用XQuery满足对XML数据的请求。 它还探讨了更复杂的情况,其中涉及将SQL嵌入XQuery中。

XQuery提供了几种不同类型的表达式,可以按照您喜欢的任何方式进行组合。 每个表达式返回一个值列表,该值可用作其他表达式的输入。 最外层表达式的结果是查询的结果。

本文重点介绍两种重要的XQuery表达式:FLWOR表达式和路径表达式。 FLWOR表达式与SQL中的SELECT-FROM-WHERE表达式非常相似:它用于遍历项目列表并有选择地返回从每个项目计算得出的内容。 另一方面,路径表达式可浏览XML元素的层次结构,并返回在路径末尾找到的元素。

就像SQL中的SELECT-FROM-WHERE表达式一样,XQuery FLWOR表达式可以包含几个以某些关键字开头的子句。 以下关键字用于在FLWOR表达式中的开始子句:

  • for :遍历输入序列,依次将变量绑定到每个输入项
  • let :声明一个变量并为其分配一个值,该值可以是包含多个项目的列表
  • where :指定用于过滤查询结果的条件
  • order by :指定结果的排序顺序
  • return :定义要返回的结果

XQuery中的路径表达式由一系列步骤组成,并用斜杠字符分隔。 以最简单的形式,每个步骤都在XML层次结构中向下导航,以找到上一步返回的元素的子级。 路径表达式中的每个步骤还可以包含谓词,该谓词过滤该步骤返回的元素,仅保留满足某些条件的元素。 例如,假设变量$clients绑定到包含<Client>元素的XML文档列表,则四步路径表达式$clients/Client/Address[state = "CA"]/zip将返回zip列表地址位于加利福尼亚的客户的代码。

在许多情况下,可以使用FLWOR表达式或路径表达式来编写查询。

使用DB2 XQuery作为顶级查询语言

要直接在DB2 V9中执行XQuery(而不是将其嵌入到SQL语句中),必须在查询前添加关键字xquery 。 这指示DB2调用其XQuery解析器来处理您的请求。 请注意,仅在将XQuery用作最外层(或顶层)语言时才需要这样做。 如果您将XQuery表达式嵌入SQL中,则无需在其xquery加上xquery关键字。 但是,本文使用XQuery作为主要语言,因此所有查询都以xquery开头。

当以顶级语言运行时,XQuery需要具有输入数据源。 XQuery可以获取输入数据的一种方式是调用一个名为db2-fn:xmlcolumn的函数,该函数带有一个标识DB2表中XML列的表名和列名的参数。 db2-fn:xmlcolumn函数返回存储在给定列中的XML文档的序列。 例如,清单4中的以下查询返回包含客户联系信息的XML文档序列。

清单4.返回客户联系数据的简单XQuery
xquery db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')

您可能从我们的数据库模式(请参阅“ 示例数据库 ”部分)中回忆起,XML文档存储在Clients表的Contactinfo列中。 请注意,此处的列名和表名以大写形式指定。 这是因为表和列的名称通常在写入DB2的内部目录之前会被大写。 由于XQuery区分大小写,因此小写的表名和列名将无法与DB2目录中的大写名匹配。

检索特定的XML元素

现在,探索一个基本任务。 假设您要检索已向您提供此信息的所有客户的传真号码。 清单5显示了一种编写此查询的方法。

清单5. FLWOR表达式来检索客户传真数据
xquery
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/fax
return $y

第一行指示DB2调用其XQuery解析器。 下一行指示DB2遍历CLIENTS.CONTACTINFO列中包含的Client元素的传真子元素。 每个传真元素依次绑定到变量$ y。 第三行表明,对于每次迭代,都返回$ y的值。 结果是一系列XML元素,如清单6所示。

清单6.上一个查询的示例输出
<fax>4081112222</fax>
<fax>5559998888</fax>

顺便说一句,输出还将包含一些本文中不太感兴趣的信息:XML版本和编码数据,例如<?xml version="1.0" encoding="windows-1252" ?>和XML名称空间信息,例如<fax xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 。 为了使输出更容易理解,本文中省略了该信息。 但是,对于许多XML应用程序来说可能很重要。 如果使用DB2命令行处理器运行查询,则可以使用-d选项取消显示XML声明信息,并使用-i选项以吸引人的方式打印结果。

清单5中所示的查询可以更简洁地表示为三步路径表达式,如清单7所示。

清单7.检索客户传真数据的路径表达式
xquery
db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/fax

路径表达式的第一步调用db2-fn:xmlcolumn函数,以从CLIENTS表的CONTACTINFO列中获取XML文档列表。 第二步返回这些文档中的所有Client元素,第三步返回嵌套在这些Client元素内的传真元素。

如果您对从查询中获取XML片段不感兴趣,而只想要限定XML元素值的文本表示形式,则可以在return子句中调用text()函数,如清单8所示。

清单8.两个查询来检索客户传真数据的文本表示
xquery
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/fax
return $y/text()(or)xquery
db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/fax/text()

这些查询的输出将类似于清单9所示。

清单9.先前查询的示例输出
4081112222
5559998888

样本查询的结果相对简单,因为传真元素基于原始数据类型。 当然,元素可以基于复杂的类型,这意味着它们可能包含子元素(或嵌套层次结构)。 我们的客户联系信息的Address元素就是一个例子。 根据本系列第2部分中定义的模式,它可以包含街道地址,公寓号码,城市,州和邮政编码。 考虑清单10中的XQuery将返回什么。

清单10. FLWOR表达式来检索复杂的XML类型
xquery
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address
return $y

如果您猜到了一系列包含Address元素及其所有子元素的XML片段,那么您是对的。 清单11显示了一个示例:

清单11.上一个查询的示例输出
<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>

注意:此示例输出的格式设置为使其更易于阅读。 DB2命令编辑器在一行上显示每个客户地址记录。

过滤XML元素值

您可以优化前面的XQuery示例以使其更具选择性。 例如,考虑如何返回居住在美国邮政编码95116中的所有客户的邮寄地址。

您可能会想到,XQuery where子句使您可以基于XML文档中zip元素的值来过滤结果。 清单12显示了如何在清单10中的前一个FLWOR表达式中添加where子句,以仅获取您感兴趣的地址。

清单12.带有新的“ where”子句的FLWOR表达式
xquery
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address
where $y/zip="95116"
return $y

添加的where子句很容易理解。 for子句依次将变量$ y绑定到每个地址。 where子句包含一个小的路径表达式,该表达式从每个地址导航到其嵌套的zip元素。 仅当此zip元素的值等于95116时, where子句才为true(并且地址会保留)。

通过将谓词添加到路径表达式中,可以获得相同的结果,如清单13所示。

清单13.带有附加过滤谓词的路径表达式
xquery
db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address[zip="95116"]

当然,您可以过滤邮政编码值并返回与街道地址无关的元素。 此外,您还可以在单​​个查询中过滤多个XML元素值。 清单14中的查询返回居住在纽约市(10011)或圣何塞市中任何地方的特定邮政编码的客户的电子邮件信息。

清单14.使用FLWOR表达式过滤多个XML元素值
xquery
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client
where $y/Address/zip="10011" or $y/Address/city="San Jose"
return $y/email

请注意, for子句已更改,因此它将变量$ y绑定到Client元素而不是Address元素。 这使您可以按子树的一部分(地址)筛选Client元素,并返回子树的另一部分(电子邮件)。 where子句和return子句中的路径表达式必须相对于绑定到变量的元素(在本例中为$ y)编写。

相同查询可以更简洁地表示为路径表达式,如清单15所示。

清单15.使用路径表达式过滤多个XML元素值
xquery
db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client[Address/zip="10011"
or Address/city="San Jose"]/email;

复查此查询的任何一种形式所带来的不明显之处在于,返回的结果与SQL程序员可能期望的两种重要方式有所不同:

  1. 对于没有给您提供电子邮件地址的合格客户,您将不会获得XML数据返回。 换句话说,如果您有1000个居住在圣何塞或邮政编码10011的客户,并且700个客户每个给您一个电子邮件地址,则您将获得返回的这700个电子邮件地址的列表。 这是由于XQuery和前面提到SQL之间的根本差异:XQuery不使用null。
  2. 您将不知道哪些电子邮件地址是从同一XML文档派生的。 换句话说,如果您有700位居住在圣何塞或邮政编码10011的客户,并且每位给您两个电子邮件地址,则您将获得返回的1400个电子邮件元素的列表。 您将不会获得700条记录的序列,每条记录都包含两个电子邮件地址。

两种情况在某些情况下可能是理想的,而在另一些情况下则是不利的。 例如,如果您需要通过电子邮件将通知发送到记录中的每个合格帐户,那么在应用程序中可以很容易地遍历XML格式的客户电子邮件地址列表。 但是,如果您只想通过电子邮件发送给每个客户,包括那些只向您提供街道地址的客户,那么以前显示的XQuery就不够了。

您可以通过多种方式重写此查询,以便返回的结果以某种方式表示缺少的信息,并指示何时从相同的客户记录(即,相同的XML文档)派生多个电子邮件地址(稍后会详细介绍)。 但是,如果您只想检索包含每个合格客户一个电子邮件地址的列表,则可以稍微修改上一个查询的return子句。

清单16.每个客户仅检索第一个电子邮件元素
xquery
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client
where $y/Address/zip="10011" or $y/Address/city="San Jose"
return $y/email[1]

该查询使DB2返回在每个合格的XML文档(客户联系记录)中找到的第一个电子邮件元素。 如果找不到符合条件的客户的电子邮件地址,则不会为该客户返回任何内容。

转换XML输出

XQuery的一个强大方面是它能够将XML输出从一种XML形式转换为另一种形式。 例如,您可以使用XQuery检索全部或部分存储的XML文档,并将输出转换为HTML,以便在Web浏览器中轻松显示。 清单17中的查询检索客户机的地址,按邮政编码对结果进行排序,并将输出转换为XML元素,这些元素是无序HTML列表的一部分。

清单17.查询DB2 XML数据并将结果作为HTML返回
xquery
<ul> {
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address
order by $y/zip
return <li>{$y}</li>
} </ul>

可以通过以下方式解剖查询:

  • 该查询从xquery关键字开始就非常简单,以向DB2解析器指示XQuery被用作主要语言。
  • 第二行使结果中包含无序列表(<ul>)HTML标记。 它还引入了花括号,该查询中使用了两个花括号中的第一个。 圆括号指示DB2评估和处理封闭的表达式,而不是将其视为文字字符串。
  • 第三行遍历客户端地址,依次将变量$ y绑定到每个地址元素。
  • 第四行包括一个新的order by子句,该子句指定结果必须根据客户的邮政编码(绑定到$ y的每个地址的zip子元素)以升序(默认顺序)返回。
  • return子句指示Address元素在返回之前将被HTML列表项标签包围。
  • 最后一行结束查询并完成HTML无序列表标记。

输出看起来类似于清单18。

清单18.上一个查询的示例HTML输出
<ul><li><Address><street>9407 Los Gatos Blvd.</street><city>Los Gatos</city><state>CA</state><zip>95032</zip></Address></li><li><Address><street>4209 El Camino Real</street><city>Mountain View</city><state>CA</state><zip>95033</zip></Address></li>
. . .
</ul>

现在考虑前面提出的一个主题:如何编写XQuery,该XQuery将指示返回结果中的缺失值,以及指示单个XML文档(例如单个客户记录)何时包含重复元素(例如多个电子邮件地址)。 这样做的一种方法涉及将返回的输出包装在新的XML元素中,如清单19中的查询所示:

清单19.指示缺失值和XQuery结果中的重复元素
xquery
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client
where $y/Address[zip="10011"] or $y/Address[city="San Jose"]
return <emailList> {$y/email} </emailList>

运行此查询将导致返回一系列emailList元素,每个符合条件的客户记录一个。 每个emailList元素都包含电子邮件数据。 如果DB2在客户的记录中找到单个电子邮件地址,它将返回该元素及其值。 如果找到多个电子邮件地址,则返回所有电子邮件元素及其值。 最后,如果找不到电子邮件地址,它将返回一个空的emailList元素。 因此,输出可能如清单20所示。

清单20.上一个查询的示例输出
<emailList><email>love2shop@yahoo.com</email>
</emailList>
<emailList/>
<emailList><email>beatlesfan36@hotmail.com</email><email>lennonfan36@hotmail.com</email>
</emailList>
. . .

使用条件逻辑

XQuery转换XML输出的能力可以与对条件逻辑的内置支持相结合,以降低应用程序代码的复杂性。 考虑一个简单的例子。 Items表包含一个XML列,其中包含客户对产品的评论。 对于请求对其评论进行回复的客户,您可能希望创建包含产品ID,客户ID和消息的新Action元素,以便可以将此信息路由给适当的人员进行处理。 但是,不需要回复的评论对企业仍然很重要,您也不想仅仅忽略它们。 相反,仅使用产品ID和消息创建一个Info元素。 这是使用XQuery if-then-else表达式完成此任务的方法:

清单21.在XQuery中使用“ if-then-else”表达式
xquery
for $y in db2-fn:xmlcolumn('ITEMS.COMMENTS')/Comments/Comment
return ( if ($y/ResponseRequested = 'Yes') then <action>{$y/ProductID, $y/CustomerID, $y/Message}</action>else ( <info>{$y/ProductID, $y/Message}</info>)
)

您现在应该已经熟悉了该查询的大多数方面,因此请专注于条件逻辑。 if子句确定给定注释的ResponseRequested子元素的值是否等于Yes。 如果是这样,则对then子句进行评估,使DB2返回一个包含三个子元素的新元素(操作):ProductID,CustomerID和Message。 否则,将评估else子句,并且DB2返回仅包含产品ID和消息数据的Info元素。

使用let子句

现在,您已经了解了如何使用FLWOR表达式的所有部分,除了let子句。 此子句用于将值(可能包含多个项目的列表)分配给可以在FLWOR表达式的其他子句中使用的变量。

假设您要列出每个产品收到的评论数的列表。 可以使用清单22中的查询完成此操作。

清单22.使用“ let”子句
xquery
for $p in distinct-values(db2-fn:xmlcolumn('ITEMS.COMMENTS')/Comments/Comment/ProductID)
let $pc := db2-fn:xmlcolumn('ITEMS.COMMENTS')/Comments/Comment[ProductID = $p]
return<product><id> { $p } </id> <comments> { count($pc) } </comments></product>

for子句中的distinct-values函数返回在Items表的“注释”列中的注释内找到的所有ProductID独特值的列表。 for子句依次将变量$ p绑定到每个这些ProductID值。 对于$ p的每个值, let子句再次扫描Items列,并将变量$ pc绑定到包含其ProductID与$ p中的ProductID匹配的所有注释的列表。 return子句为每个不同的ProductID值构造一个新的product元素。 这些产品元素中的每个元素都包含两个子元素:一个包含ProductID值的id元素,一个包含对给定产品收到多少条评论的计数的comment元素。

该示例查询的结果可能类似于清单23。

清单23.上一个查询的示例输出
<product><id>3926</id><comments>28</comments>
</product>
<product><id>4097</id><comments>13</comments>
</product>

带有嵌入式SQL的XQueries

到目前为止,您已经了解了如何编写XQuery来检索XML文档片段,创建XML输出的新形式以及根据查询本身指定的条件返回不同的输出。 简而言之,您已经学到了几种使用XQuery查询DB2中存储的XML数据的方法。

可以肯定的是,除了这篇简短的文章外,还有更多关于XQuery的知识。 但是还有一个更广泛的主题尚未涉及:如何将SQL嵌入XQuery中。 如果您需要编写查询来基于XML和非XML列值过滤数据,那么这样做会很有用。

您可能会从本系列的第3部分中回想起如何在SQL语句中嵌入简单的XQuery表达式来完成此任务。 在这里,看看如何做相反的事情:将SQL嵌入XQuery中以限制基于传统SQL数据值和特定XML元素值的结果。

代替db2-fn:xmlcolumn函数(该函数返回表的列中的所有XML数据),您可以调用db2-fn:sqlquery函数,该函数执行SQL查询并仅返回所选数据。 传递给db2-fn:sqlquerySQL查询必须返回XML数据。 然后,XQuery可以进一步处理此XML数据。

清单24中的查询检索有关评论的信息,这些评论涉及建议零售价(srp)超过100美元的产品,其中包括客户的响应请求。 回想一下,定价数据存储在SQL小数列中,而客户注释存储为XML。 对于数据库中存储的每个合格注释,返回的数据(包括产品ID,客户ID和客户消息)都包含在单个XML操作元素中。

清单24.在XQuery中嵌入SQL
xquery
for $y in
db2-fn:sqlquery('select comments from items where srp > 100')/Comments/Comment
where $y/ResponseRequested="Yes"
return (<action>{$y/ProductID, $y/CustomerID, $y/Message}</action>
)

现在,大多数查询对于您来说应该看起来都很熟悉,因此请看一下新功能: db2-fn:sqlquery. DB2处理提供给该函数SQL SELECT语句,以确定哪些行包含有关价格超过100美元的商品的信息。 存储在这些行中的文档用作路径表达式的输入,该路径表达式返回所有嵌套的Comment元素。 查询的后续部分使用XQuery where子句进一步过滤返回的数据,并将部分选定的注释转换为新的XML片段。

考虑到这一点,请考虑如何解决稍有不同的问题。 想象一下,您想要一个居住在圣何塞的Gold客户的所有电子邮件地址的列表。 此外,如果单个客户端有多个电子邮件地址,则希望将所有电子邮件地址作为单个客户端记录的一部分包含在输出中。 最后,如果合格的Gold客户没有给您提供电子邮件地址,则您要检索其邮寄地址。 清单25显示了编写这种查询的一种方法:

清单25.在包含条件逻辑的XQuery中嵌入SQL
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
)

此查询的两个方面值得解释。 首先,第二行中嵌入的SELECT语句包含一个基于Status列的查询谓词,将该VARCHAR列的值与字符串Gold 。 在SQL中,此类字符串用单引号引起来。 请注意,尽管该示例似乎使用了双引号,但实际上它在比较值(“ Gold”)之前和之后都使用了两个单引号。 多余的单引号是转义字符。 如果在基于字符串的查询谓词周围使用双引号,而不是单引号对,则会出现语法错误。

此外,此查询中的return子句包含条件逻辑,以确定给定客户记录中是否存在电子邮件元素。 如果是这样,查询将返回一个新的emailList元素,其中包含所有客户的电子邮件地址(即该客户的所有电子邮件元素)。 如果不是,它将返回客户的邮寄地址(即该客户的Address元素)。

索引编制

值得注意的是,您可以创建专门的XML索引来加快对XML列中存储的数据的访问。 因为这是一篇介绍性文章,并且示例数据很小,所以此处不涉及该主题。 但是,在生产环境中,定义适当的索引对于实现最佳性能至关重要。 请参阅相关主题有关DB2的索引技术的更多信息。

摘要

XQuery在很大程度上不同于SQL,本文重点介绍了其中的几种。 了解更多有关该语言的信息,可以帮助您确定什么时候对您的工作最有利,也可以帮助您了解何时将XQuery与SQL结合使用。 本系列的其他文章描述了如何开发利用DB2 XML功能的Java应用程序。 不过,到目前为止,本文包含一个简单的Java示例 ,该示例描述了Java应用程序如何嵌入XQuery。

致谢

感谢George Lapis,Matthias Nicola和Gary Robinson审阅本文。


翻译自: https://www.ibm.com/developerworks/data/library/techarticle/dm-0604saracco/index.html

xquery

xquery_使用XQuery查询DB2 XML数据相关推荐

  1. sql查询返回xml数据之应用【转载】

    sql查询返回xml数据之应用[转载] 今天查看邮件,看到一标题Using the FOR XML Clause to Return Query Results as XML,点进去看了看,以前也是知 ...

  2. mysql获取亚马逊数据_亚马逊(MWS)订单查询-ListOrders查询返回xml数据保存数据库——PHP...

    //设置编码格式 header("Content-type: text/html; charset=utf-8"); //用mysqli来连接数据库(服务器,用户名,密码,数据库名 ...

  3. Xquery 被设计用来查询 XML 数据

    http://www.w3school.com.cn/xquery/xquery_intro.asp 解释XQuery最佳方式是这样讲:XQuery 相对于 XML 的关系,等同于 SQL 相对于数据 ...

  4. oracle+xquery函数,Oracle XQuery查询、构建和转换XML

    查询 Oracle XML DB 信息库中的 XML 数据 为访问 Oracle XML DB 信息库中存储的 XML 数据,Oracle XQuery 引入了 fn:doc 和 fn:collect ...

  5. oracle+xquery函数,Oracle XQuery查询、构建和转换XML(2)

    查询 Oracle XML DB 信息库中的 XML 数据 为访问 Oracle XML DB 信息库中存储的 XML 数据,Oracle XQuery 引入了 fn:doc 和 fn:collect ...

  6. oracle xdb xquery,Oracle XQuery查询、构建和转换XML(4)

    将动态变量绑定到 XQuery 表达式 另一种可以显著提高 XQuery 表达式执行性能的技术是使用绑定动态变量.使用绑定变量(而不是将变量串联为字符串)可以使 Oracle 重用 SQL 语句,从而 ...

  7. db2有MySQL那样的时间戳_MySQL 按照日期格式查询带有时间戳数据

    按照日期格式查询带有时间戳数据一般在MSQL数据库中的时间都是以时间戳的格式来存储时间的,但是对于我们来说,时间戳格式具体表示的是什么时间,我们很难一眼看出来,所以当我们要具体查询某一个时间或时间段的 ...

  8. xquery_使用XQuery处理XML

    xquery 存档日期:2019年5月13日 | 上次更新时间:2007年3月27日 | 首次发布:2002年9月24日 多年来,开发人员一直使用SQL从结构化源(例如关系数据库)中检索数据. 但是, ...

  9. Android学习笔记---29_构建soap协议内容,发送xml数据和调用webservice,手机号码归属地查询器

    29_发送xml数据和调用webservice ---------------------------------------- 1.发送xml数据给web应用   a.可以通过参数的方式:比如:ht ...

最新文章

  1. python phpstudy_GitHub - Writeup007/phpStudyBackDoor: phpStudy后门检测与利用工具,Python脚本,可一键 GetShell。...
  2. OutOfMemoryException异常解析
  3. pb9 调用系统语音_成都电销系统一个月多少钱_选择灵狐传媒_收费透明
  4. mysql不属于nosql_哪个数据库不属于nosql的范畴
  5. 松下服务器型号说明,透析数码相机型号命名规则(松下篇
  6. Channel~scatter and gather
  7. jt808终端鉴权_JT808-1: JT808协议、GB808协议、道路运输车辆卫星定位系统-北斗兼容车载终端通讯协议...
  8. Win32汇编:数组与标志位测试总结
  9. AnnotationProcessor 处理器不工作怎么定位?
  10. Matlab编程之混沌系统李雅普诺夫指数分析
  11. C语言:运算符-符号常量-输入输出
  12. PTA python 习题及代码实例
  13. shiro手机无状态登录访问和电脑端登录访问两种方式处理
  14. Unity流水账8:MeshComponents
  15. 每日格言积累及总结——更新中
  16. 解决小程序自定义弹窗滚动穿透问题
  17. 20:00 @烤仔建工 | 来体验你人生中第一次元宇宙狼人杀鸭~
  18. ❀YOLOv5学习❀图像标注工具LabelImg的下载,配置和使用。
  19. win10更改user中文换英文名
  20. 腾讯视频直播间 v9.6.695 官方正式版

热门文章

  1. c语言gcc运行命令,c语言在gcc中怎么运行程序?
  2. 金蝶云苍穹笔记(四)
  3. SAP 批量修改或添加BOM组件
  4. 在VS Code中调试nasm,使用golink连接
  5. Linux meld安装
  6. 二项式定理与二项分布、多项式定理与多项分布
  7. 新手小白之初识JAVA,随堂笔记
  8. 【Day7.1】张掖七彩丹霞看日出
  9. 铸博皇御:白银多少钱,白银交易有哪些优势
  10. 第 2-3 课:迭代法计算定积分