使用XQuery查询DB2XML数据

   2015-06-30 0
正在看的db2教程是:使用XQuery查询DB2 XML数据。

关于 XQuery
XQuery 在很多关键方面都与 SQL 有所不同,这很大程度上是因为这两种语言是针对两种具有不同特征的数据模型而设计的。XML 文档包含层次结构,并且有其固有的顺序。而基于 SQL 的数据库管理系统所支持的表格数据结构是平面的(flat),并且是基于集合的;因此,行之间不存在顺序。

这两种数据模型的不同导致它们各自的查询语言有很多基本的不同。例如,XQuery 支持路径表达式,以允许程序员在 XML 的层次结构中导航,而纯 SQL(没有 XML 扩展)则不支持。XQuery 支持有类型的和无类型的数据,而 SQL 数据总是以指定类型定义的。XQuery 没有 null 值,因为 XML 文档会忽略缺失的或未知的数据。当然,SQL 使用 null 来表示缺失的或未知的数据值。XQuery 返回一系列的 XML 数据,而 SQL 则返回各种 SQL 数据类型的结果集。

这只是 XQuery 和 SQL 之间的基本不同点中的一部分。提供一份详尽的列表超出了本文的范围,不过即将发表的 IBM Systems Journal 将更详细地讨论这些语言的不同。现在我们就探索一下 XQuery 语言的一些基本方面,并看看如何使用它来查询 DB2 Viper 中的 XML 数据。

样本数据库

本文中的查询访问在 “DB2 Viper 快速入门”(developerWorks,2006 年 4 月)中创建的样本表。清单 1 给出了样本数据库中 “items” 和 “clients” 表的定义:

清单 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

)

图 1 中显示了 “items.comments” 列中包含的样本 XML 数据,而 图 2 中则显示了 “clients.contactinfo” 列中包含的样本 XML 数据。随后的例子查询将引用这两个 XML 文档中的一个或两个中的特定元素。

图 1. 存储在 “items” 表的 “comments” 列中的样本 XML 文档

使用XQuery查询DB2XML数据

图 2. 存储在 “clients” 表的 “contactinfo” 列中的样本 XML 文档

使用XQuery查询DB2XML数据

查询环境

本文中的所有查询都是通过交互方式发出的。这可以通过 DB2 命令行处理器或 DB2 Control Center 的 DB2 Command Editor 来完成。本文中的屏幕图像和说明主要使用后一种方式。(DB2 Viper 还附带了一个基于 Eclipse 的 Developer Workbench,它可以帮助程序员以图形化的方式构造查询。本文不讨论应用程序开发问题和 Developer Workbench。)

要使用 DB2 Command Editor,启动 Control Center,并选择 Tools -> Command Editor。这时将出现如 图 3 所示的窗口。在上面的面板中输入查询,单击左上角的绿色箭头运行该查询,然后可以在下面的面板中或者在 “Query Results” 选项卡中查看输出。

图 3. DB2 Command Editor,可以从 DB2 Control Center 中启动

使用XQuery查询DB2XML数据

XQuery 例子

与在 “用 SQL 查询 DB2 XML 数据” 中一样,本文将逐步讲解一些常见的业务场景,并展示如何使用 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 中的路径表达式由一系列的 “步(step)” 组成,之间以斜杠隔开。在最简单的形式中,每一步在 XML 层次中向下导航,以发现由前一步返回的元素的孩子。路径表达式中的每一步还可以包含一个谓词,用于过滤该步返回的元素,只保留满足某种条件的元素。例如,假设变量 $clients 被绑定到包含 <Client> 元素的 XML 文档的一个列表,则 4 步路径表达式 $clients/Client/Address[state = "CA"]/zip 将返回居住在加利福尼亚的客户的邮政编码。

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

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

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

当 XQuery 被作为顶层语言时,它需要一个输入数据的源。XQuery 获得输入数据的一种方式是调用一个名为 db2-fn:xmlcolumn 的函数,调用时带一个参数,表明 DB2 表中 XML 列所在的表名和该列的列名。db2-fn:xmlcolumn 函数返回存储在给定列中的一系列的 XML 文档。例如,下面的查询返回一系列包含客户联系方式信息的 XML 文档:

清单 2. 返回客户联系方式数据的简单 XQuery



x

[1] [2] [3] [4] [5] 下一篇

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • mysql sql使用记录
    mysql sql使用记录
    mysql 查询 1: Distinct      有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能去重他的目标字段(
    02-10
  • MYSQL:SQL中Group By的使用
    MYSQL:SQL中Group By的使用
    SQL中Group By的使用 1、概述2、原始表3、简单Group By4、Group By 和 Order By5、Group By中Select指定的字段限制6、Group By All7、Group By与聚合函数8、Having与Where的区别9、Compute 和 Compute By1、概述“Group By”从字面意义上理解就是根据“By”
    02-10
  • 使用pl/sql developer登陆不了oracle
    使用pl/sql developer登陆不了oracle
    1,Oracle ORA12514 监听程序当前无法识别连接描述符中请求的服务  这里最主要的原因在于:(参考:https://www.cnblogs.com/shangshan/p/6359880.html   https://blog.csdn.net/lwpoor123/article/details/78327080)  数据库动态注册不生效,导致监听
    02-10
  • MySql使用show processlist查看正在执行的Sql语
    今天上班例行的查看了下服务器的运行状况,发现服务器特卡,是mysqld这个进程占用CPU到了99%导致的。比较好奇是那个程序在使用mysql导致cpu这么高的,通过show processlist命令查看了当前正在执行的sql语句,从而定位到了对应的程序,发现代码中有一个死循环
    02-10
  • 如何使用mysqldump命令导入导出数据库下的数据或表结构(远程or本地都适合)
    


            
如何正确从他人机器MySQL数据库下拷贝出.sql,再导入到自己window
    如何使用mysqldump命令导入导出数据库下的数据
        不多说,直接上干货!  https://www.cloudera.com/documentation/manager/5-1-x/Cloudera-Manager-Installation-Guide/cm5ig_mysql.html?scroll=cmig_topic_5_5      命令行下具体用法如下: mysqldump -u用户名 -p密码 -d  数据库名 表名
    02-10
  • Oracle PL/SQL之函数索引(Function-based inde
    函数索引(Function-based indexes)只有在where条件使用了与索引中相同的基于相同列的函数时才起作用。 duzz$scott@orclset autotrace onduzz$scott@orclcreate table t1 as select * from dept;Table created.Elapsed: 00:00:00.01duzz$scott@orclcreate i
    02-10
  • 在MySQL命令行中使用SQL语句的规则 mysql语法规
    规则1: SQL语句必须以分号(;)或者(\G)结束分号(;)是SQL语句的结束标志。如果遗忘了分号,而直接按下回车键时,在MySQL客户端上将显示如下mySQL SELECT * FROM customer-因为没有以分号结束,客户端认为SQL语句并没有结束,显示[-]等待用户继续输入命令,直到
    02-10
  • 免安装Oracle客户端使用PL/SQL连接Oracle oracl
    大家都知道,用PL/SQL连接Oracle,是需要安装Oracle客户端软件的。有没要想过不安装Oracle客户端直接连接Oracle呢?      其实我一直想这样做,因为这个客户端实在太让人讨厌了!!!不但会安装一个JDK,而且还会把自己放在环境变量的最前面,会造成不小
    02-10
  • hive界面工具SQL Developer的安装;使用sql developer连接hive;使用sql developer连接mysql
    hive界面工具SQL Developer的安装;使用sql dev
    需要oracle帐号登录后下载1、下载:http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html 2、下载后的就是xxx.app,直接启动即可 如何使用sql developer连接hive1、首先下载hive的jdbc驱动:https://www.cloudera.com/do
    02-10
  • 本机不安装oracle服务器 和 客户端 使用pl/sql 及 powerdesigner反向工程生成不同数据库的sql脚本
    本机不安装oracle服务器 和 客户端 使用pl/sql
    本机为win7  安装数据库总是出错。一直未安装oracle 服务器及客户端。1、使用pl/sql ,网络上找到的方法:a、在安装oracle服务器的机器上搜索下列文件:oci.dll     ocijdbc10.dll     ociw32.dll     orannzsbb10.dll     oraocci10.dll  
    02-10
点击排行