转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> ORACLE >> 正文
更新XQuery         ★★★★

更新XQuery

作者:闵涛 文章来源:闵涛的学习笔记 点击数:646 更新时间:2009/4/22 21:59:04


 

XQuery有了一些新特性,内容包括从原子化到跟踪文件结构。

在"你所不了解的XQuery"(Oracle杂志,2003年5/6月刊)一文中,我介绍了XQuery,它是一项由万维网联盟(W3C)开发的技术,设计用来查询和操纵XML数据或任何能以XML形式出现的数据,如关系型数据库。那篇引文讨论了2002年11月发布的XQuery草案规范。2003年5月,W3C发布了新的XQuery草案规范,本文追踪报道了5月份发布的草案规范中最令人感兴趣的变化和新增加的特性,其中包括库模块、序(prolog)变量、外部函数以及用于调试、错误处理和格式化的新函数。

变化

5月草案增加了大量新特性,但是我首先讨论对现有特性所做的更改。有些更改是表面上的。 例如,document()输入函数(该函数使用给定的统一资源标识符[URI]返回一个文档)被改为一个新的更短的名字doc()。另外,曾经被写成{- comment -}的注释现在改用新的笑脸符号(: comment :)。是的,现在每个注释都成了一个笑话。

有些更改则是更根本的。也许最重大的改动就是distinct-values()函数不再返回节点(节点是XML结构,如元素、文档、注释以及文本节点),它只返回原子值(如整数或字符串)。尽管该函数仍然接受节点和原子值,但只返回原子值。任何进入该函数的节点都会被"原子化"并被当作原子值,然后以原子形式返回。

原子化的规则很复杂,这里给出一些基本的:由模式定义为布尔型的元素将被原子化为true/false布尔值。定义为整型的元素将被原子化为一个整数。没有被模式定义的元素将被原子化为节点的XPath字符串值(文本节点递归地连接在一起)。

为了说明:

 

distinct-values(<item>apple</item>,
       <item>banana</item>, "grape")

 

返回值("apple","banana","grape"),假设在模式中没有声明 。在下面的例子中,如果我们假设 被模式定义为布尔型,那么下面的语句:

 

distinct-values(<status>0</status>,
                <status>false</status>)

 

返回false(),因为它是两个元素的原子值。记住false()是XQuery常量,表示"假"。

现在你也许会想,"当我想返回节点时,可以使用distinct-nodes()函数。" 是的,但该函数只能根据节点标识删除重复节点(那些完全相同的节点,类似于Java中引用的等效节点)。没有能删除等效节点的函数。这会使查询变得复杂,因为没有办法能轻松地删除等效节点。

回过头来看我以前的那篇文章"你所不了解的XQuery",你将发现有些示例会受到这一改动的影响。在那篇文章中,下面的查询返回了艺术家名字的惟一列表,其中每一个名字前后都带有 标记:

 

distinct-values(document("itunes.xml")
          /itunes/Tracks/Track/Artist)

 

示例输出类似于:

 

<Artist>Marc Cohn</Artist>
<Artist>Pink Floyd</Artist>

 

现在,执行同样的查询则返回原子值:

 

Marc Cohn
Pink Floyd

 

由于distinct-values()去掉了 标记(这是原子化过程的一部分),所以你必须在完成distinct-values()调用后添加标记,如下所示:

 

let $artists :=
  distinct-values(doc("itunes.xml")
            /itunes/Tracks/Track/Artist)
for $a in $artists
return <Artist>{ $a }</Artist>

不是每种情况都是这么轻松地得到处理。看一下W3C 使用案例文档中的示例1.1.9.4在2002年11月版与2003年5月版中是如何变化的。该示例返回每位作者的著作列表。它使用了distinct-values(),根据2002年11月的规范,它的代码如下:

 

<results>
{
  for $a in distinct-values(
    document("http://www.bn.com/bib.xml")
    //author)
  return
    <result>
    { $a }
    {
    for $b in document(
      "http://www.bn.com/bib.xml")
      /bib/book
    where some $ba in $b/author
      satisfies deep-equal($ba,$a)
  

;  return $b/title
    }
    </result>
}
</results>

 

根据查询结果你不能直接分辨出姓和名,但每个 元素都由一个 和 名组成。distinct-values()调用返回具有惟一名字的 元素列表。对于2003年5月的规范,现在查询必须在姓和名上单独运行distinct-values(),而且在嵌套的FLWOR表达式中也没有将$a指定为惟一的作者:

 

<results>
{
  let $a :=
    doc("http://www.bn.com/bib/bib.xml")
    //author
  for $last in distinct-values($a/last),
      $first in distinct-values(
                   $a[last=$last]/first)
  return
    <result>
    { $last, $first }
    {
    for $b in
      doc("http://www.bn.com/bib.xml")
      /bib/book
    where some $ba in $b/author
      satisfies ($ba/last = $last and
                 $ba/first=$first)
    return $b/title
    }
    </result>
}
</results>

 

除了编写用户定义的distinct-deep-equal()外,没有更好的方法来完成这件事了,而该方法在纯XQuery中不能执行。(注:FLWOR(发音为"flower")表达式是XQuery的构建模块。这个名字来源于组成表达式的关键词For、Let、Where、Order by和Return}。

新函数

2003年5月的XQuery规范草案增加了三个新函数,它们肯定会非常有用。第一个是:

 

trace($value as item()*,
     $label as xs:string) as item()*

 

trace()函数允许在查询的中间进行printf风格的调试。该函数有两个参数:要显示的值(可以是任意多个项的序列)以及要显示的这个值的字符串标签。为方便起见,函数返回$value传递的值。trace()输出的位置由你的引擎来决定。

该函数使你能够详细查看查询的内部过程。例如,下面的查询根据文档名返回在XQuery引擎中存储的所有文档的URI。通过增加一个trace()调用,我能够在排序前查看返回的每个URI:

 

define function uris() as xs:string* {
  for $n in input()
  return trace(
    xs:string(document-uri($n)), "base:")
}
for $u in uris() order by $u return $u





没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台