Oracle XQuery查询、构建和转变XML

Oracle XQuery查询、构建和转变XML

XML查询技能

XML文书档案以一个纯文本的样式存在,主要用以数据存款和储蓄。不但低价顾客读取和行使,何况使修改和护卫变得更便于。

 

在 Oracle 数据库 10g 第 2 版中,Oracle
引入了三个与该数据库集成的专职能自带 XQuery
引擎,该引擎可用来达成与付出支持 XML 的应用程序相关的各类任务。XQuery
是一种用于拍卖 XML 数据模型的查询语言,它实际上可操作任何类型的可用 XML
表明的数目。就算 Oracle XQuery
施行让你能够行使数据库数据和表面数据源,但在拍卖数据库中蕴藏的结构化数据方面,Oracle
XML DB 平时能够显明坚实质量。

初稿地址:

XML数据类型

XML是SQL
Server中放置的数据类型,可用来SQL语句大概当作存款和储蓄过程的参数。客商能够直接在数据库中蕴藏、查询和保管XML文件。XML数据类型还可以保留整个XML文档。XML数据类型和别的数据类型不设有根本上的反差,可以把它用在别的日常SQL数据类型能够利用的地方。
示例1:创设二个XML变量并用XML填充

DECLARE @doc XML
SELECT @doc='<Team name="Braves" />';

示例2:创造XML数据类型列

CREATE TABLE t1(
column1 INT,
column2 XML,
CONSTRAINT pk_column1 PRIMARY KEY(column1));

在地点的以身作则中,column2列是XML数据类型列。
示例3:无法将XML数据类型列设置为主键或外键

CREATE TABLE t1(
column1 INT,
column2 XML,
CONSTRAINT pk_column1 PRIMARY KEY(column2));

施行上边的代码,报错如下:
消息1919,级别16,状态1,第1 行
表’t1′ 中的列’column2′ 的品种不可能用作索引中的键列。
消息1750,级别16,状态0,第1 行
不能制造约束。请参阅前边的荒谬音信。
XML数据类型的利用范围
唯有STLacrosseING数据类型能力调换到XML。
XML列不可能使用于GROUP BY语句中
XML数据类型存款和储蓄的多寡不可能超过2GB
XML数据类型字段不能够被设置成主键恐怕外键或称为其一部分。
Sql_variant数据类型字段的接纳无法把XML数据类型作为种子项目。
XML列无法钦定为独一的。
COLLATE子句无法被选用在XML列上。
存款和储蓄在数据库中的XML仅扶助128级的层系。
表中最对只可以具有叁11个XML列。
XML列无法进入到准则中。
独一可利用于XML列的放置标量函数是ISNULL和COALESCE。
享有XML数据类型列的表不可能有三个超过15列的主键。

SQL
Server对于XML帮忙的骨干在于XML数据的格式,这种数据类型能够将XML的数额存款和储蓄于数据库的靶子中,比如variables,
columns, and
parameters。当您用XML数据类型配置这个目的中的二个时,你钦点项指标名字就好像您在SQLServer
中钦命三个门类一样。

正文提供的亲自去做不独有示范了在怎么着场馆下以及哪些运用 XQuery 查询、构建和转变XML,並且还亲自过问了什么监察和控制和解析 XQuery
表明式的性质实行,进而找到更便捷的秘籍来管理同一职业负荷。

类型化的XML和非类型化的XML

能够创制xml类型的变量,参数和列,或许将XML架构集结和xml类型的变量、参数或列关联,这种景况下,xml数据类型实例称之为类型化xml实例。不然XML实例称为非类型化的实例。

XML的数据类型确认保证了你的XML数据被整体的构建保存,同期也适合ISO的行业内部。在概念三个XML数据类型在此之前,大家先是要精晓它的二种范围,如下:

依靠关周密据创设 XML

 

XML数据类型方法

XML数据类型共有5种方法
query():施行八个XML查询并回到查询结果(再次来到三个XML数据类型)。
示例4

DECLARE @xmlDoc XML--声明XML类型的变量@xmlDoc
SET @xmlDoc='<students>
    <class name="数学" NO="8501">
        <student>
            <name>李林</name>
            <sex>男</sex>
            <age>16</age>
            <address>江苏</address>
        </student>
    </class>
</students>'--将XML实例分配给变量@xmlDoc
SELECT @xmlDoc.query('/students/class/student') AS test
--用query()查询@xmlDoc变量实例中标签<student>的子元素

查询结果如图所示
图片 1
点击查询结果
图片 2
如想询问标签

DECLARE @addr XML--声明一个XML类型变量@addr
SET @addr='/students/class/student'
SELECT @addr.exist('/students/class="江苏"') AS 返回值

结果如图所示
图片 3

注:exsit()方法的参数不必做准确定位

Value():总结叁个查询并从XML中回到壹个简易的值(只可以回去单个值,且该值为非XML数据类型)。
Value()方法有2个参数XQuery和SQLType,XQuery参数表示命令要从XML实例之中查询数据的具体地点,SQLType参数表示value()方法再次来到的值的首选数据类型。
示例6

DECLARE @xmlDoc XML--声明XML类型的变量@xmlDoc
DECLARE @classID INT--声明INT类型的变量@classID
SET @xmlDoc='<students>
    <class name="数学" NO="8501">
        <student>
            <name>李林</name>
            <sex>男</sex>
            <age>16</age>
            <address>江苏</address>
        </student>
    </class>
</students>'--将XML实例分配给变量@xmlDoc
SET @classID=@xmlDoc.value('(/students/class/@NO)[1]','INT')
--将value()方法返回值赋值给变量@classID
SELECT @classID AS classID

查询结果如图所示
图片 4

注:SQLType无法是XML数据类型,公共语言运转时(CLRAV4)顾客定义类型,image,text,ntext或sql_variant数据类型,但足以是客户自定义数据类型SQL。

Modify():在XML文书档案的方便地方推行贰个修改操作。它的参数XML_DML代表一串字符串,依据此字符串表明式来更新XML文书档案的内容。
示例7:在@xmlDoc的实例中,成分

DECLARE @xmlDoc XML--声明XML类型的变量@xmlDoc
SET @xmlDoc='<students>
    <class name="数学" NO="8501">
        <student>
            <name>李林</name>
            <sex>男</sex>
            <age>16</age>
            <address>江苏</address>
        </student>
    </class>
</students>'
SELECT @xmlDoc AS '插入节点前信息'
SET @xmlDoc.modify('insert <学历>本科</学历> after (students/class/student/age)[1]')
SELECT @xmlDoc AS '插入节点后信息'

询问结果插入节点后新闻如图所示
图片 5

注:modify()方法的参数中insert和其他着重字必得小写,不然会报错

Nodes():允许把XML分解到二个表结构中。此格局将XML数据类型实例拆分为关周到据,并赶回包涵原始XML数据的行集。
示例8:还是用@locat参数的实例来演示

DECLARE @locat XML--声明XML变量@locat
SET @locat=
'<root>
    <location locationID="8">
        <step>8的步骤</step>
        <step>8的步骤</step>
        <step>8的步骤</step>
    </location>
    <location locationID="9">
        <step>9的步骤</step>
        <step>9的步骤</step>
        <step>9的步骤</step>
    </location>
    <location locationID="10">
        <step>10的步骤</step>
        <step>10的步骤</step>
        <step>10的步骤</step>
    </location>
    <location locationID="11">
        <step>11的步骤</step>
        <step>11的步骤</step>
        <step>11的步骤</step>
    </location>
</root>'--@locat变量的实例

SELECT T.Loc.query('.') AS result
FROM @locat.nodes('/root/location') T(Loc)
GO

查询结果如下图所示
图片 6

  • 贰个实例的XML列不能够包括超过2GB的数额。
  • 二个XML的列不能够是索引。
  • XML对象不能采纳Group By的子句中。
  • XML的数据类型不帮衬比较和排序。

在急需的场所下(比如,向 Web 服务发送结果),您大概要依赖关周全据创设XML。要在 Oracle 数据库 10g 第 2
版从前的本子中做到此职责,日常必要利用 SQL/XML 生成函数,如
XMLElement、XMLForest 和 XMLAgg()。在 Oracle 数据库 10 g 第 2
版中,XQuery 将比那几个函数更为便捷。具体来讲,在 XQuery 表明式内部使用
ora:view XQuery 函数,您能够查询现成的关系表或视图以及当时创设XML,进而不供给经过关周密据显式创造 XML 视图。列表 1 中的 PL/SQL
代码演示了哪些选拔 ora:view 基于示例数据库方式 HEvoque的暗许职员和工人涉嫌表中贮存的数目营造 XML 文档。

引用:

XQuery简介

XQuery是一种查询语言,能够查询结构化或然半结构化的多少。SQL Server
二零零六中对XML数据类型提供了支撑,能够存款和储蓄XML文书档案,然后使用XQuery语言实行查询。

概念叁个XML变量

列表 1:使用 ora:view 基于关全面据制造 XML

摘要

FOR XML子句

经过在SELECT语句中动用FOHighlanderXML子句能够把数据库表中的数据检索出来并生成XML格式。SQL Server
贰零壹零援救FO景逸SUVXML的四种情势,分别是RAW格局,AUTO格局,EXPLICIT方式和PATH情势。

DECLARE @ClientList XML
SET @ClientList =
'<?xml version="1.0" encoding="UTF-8"?>
<!-- A list of current clients -->
<People>
<Person id="1234">
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Person>
<Person id="5678">
<FirstName>Jane</FirstName>
<LastName>Doe</LastName>
</Person>
</People>'
SELECT @ClientList
GO
BEGIN
IF(DBMS_XDB.CREATEFOLDER('/public/employees')) THEN
DBMS_OUTPUT.PUT_LINE('Folder is created');
ELSE
DBMS_OUTPUT.PUT_LINE('Cannot create folder');
END IF;
COMMIT;
END;
/
DECLARE
XMLdoc XMLType;
BEGIN
SELECT XMLQuery(
'for $j in 1
return (
{
for $i in ora:view("HR", "employees")/ROW
where $i/EMPLOYEE_ID <= 102
return (
{xs:string($i/EMPLOYEE_ID)}
{xs:string($i/LAST_NAME)}
{xs:integer($i/SALARY)}
)} )'
RETURNING CONTENT) INTO XMLdoc FROM DUAL;
IF(DBMS_XDB.CREATERESOURCE('/public/employees/employees.xml', XMLdoc)) THEN
DBMS_OUTPUT.PUT_LINE('Resource is created');
ELSE
DBMS_OUTPUT.PUT_LINE('Cannot create resource');
END IF;
COMMIT;
END;
/

正文介绍了SQL Server
二零零五可见援救的XQuery的各地方特征如FLWO大切诺基语句,XQuery的操作,if-then-else结构,XML的构造函数,XQuery的放置函数,类型的转变操作符,并举个例子表明了上述XQuery功用的选用和操作。本文同有的时候候也对SQL
Server
贰零零柒所不可能支撑的XQuery的表征开展了深入分析钻探,并建议了实在工作中的应用方案。在本文的末梢章节中,详细举个例子介绍了两种特定的XQuery应用场景。

FOR XML RAW

将表调换来成分名称是row,属性名字为列名恐怕列的别称。
示例9:将Student表转变为XML格式(FOENVISION XML RAW)
Student表的数据如图所示
图片 7
推行语句:

SELECT * FROM Student FOR XML RAW;

查询结果如图所示
图片 8
图片 9

其一事例通过动用DECLARE  评释去定义名叫@ClientList
的变量,当自己评释变量的时候,只必要富含XML的数据类型的名字在变量名后。

在列表 1 中的第三个 PL/SQL 进度中,您只是在 XML
信息库中开创了二个新文件夹。在该音信库文件夹中,您随后将积累此处显示的第一个PL/SQL 进度中开创的 XML 文书档案。第3个 PL/SQL 进程首首发出 SELECT
语句,该语句使用 XMLQuery SQL 函数基于关周全据营造 XML。对于 XQuery
表明式(XMLQuery 在此处将其看作参数)来讲,请在意嵌套的 FLWO奥迪Q7表达式中动用的 ora:view XQuery 函数。在该示例中,ora:view
获取七个输入参数,即“HTiguan”和“employees”,它们提醒该函数查询属于 HLX570数据库格局的职员和工人表。因而,ora:view 将回到二个代表 HLAND.employees
表行的职工 XML
文书档案类别。但为了节省结果文档中的空间,只将前四个职工记录传递给结荚体系。那是经过在
FLWO中华V 表达式的 where 子句中钦命 $i/EMPLOYEE_ID <= 102
而落到实处的。请留神 FLWO安德拉 表达式的 return 子句中选取的 xs:string()
xs:integer() XQuery 类型表明式。实际上,此处使用的那五个 XQuery
表达式不止将 XML
节点值转变为相应的项目,并且还将领到那个节点值。随后,生成的职工 XML
文书档案作为 employees.xml 保存到事先在列表 1 中另三个 PL/SQL 进度中开创的
/public/employees XML 音信库文件夹。要有限支持此操作已形成,可进行以下查询:

引用:

FOR XML AUTO

动用表名称作为成分名称,使用列名称作为品质名称,SELECT关键字前面列的次第用于XML文书档案的档次。
示例10:将Student表转换为XML格式(FOENVISION XML AUTO)
施行语句:

SELECT * FROM Student FOR XML AUTO;

询问结果如图所示
图片 10
图片 11

本身设定了变量的值,然后使用select
来探求这些值。和大家想的一致,它回到了XML的文书档案。如下:

SELECT XMLQuery('for $i in fn:doc("/public/employees/employees.xml")
return;
$i'
RETURNING CONTENT) AS RESULT FROM DUAL;

内容目录

FOR XML EXPLICIT

允许客商显式地定义XML树的造型,不受AUTO模式中的各样限制。不可能将FOXC90 XML
EXPLICIT直接用在SELECT子句中。
示例11:将xmlTest表转变为XML格式(FOPAJERO XML EXPLICIT)
XmlTest表的数码如图所示
图片 12

SELECT DISTINCT 1 AS TAG,--指定顶级层级序号1
NULL AS PARENT,--该层级没有父级
NULL AS '班级信息!1!',
NULL AS '班级信息!2!班级',
NULL AS '班级信息!2!班级类型',
NULL AS '班级信息!2!班主任',
NULL AS '学生信息!3!学号!Element',
NULL AS '学生信息!3!学生姓名!Element',
NULL AS '学生信息!3!性别!Element',
NULL AS '学生信息!3!总分!Element'--设置所有层级元素和属性命名,暂时不对这些元素赋值
--例如在“学生信息!3!总分!Element”格式中,学生信息是元素名,3表示该元素所处层级,总分表示属性名
--Element指出生成以属性单独为一行的XML格式
UNION ALL--层级之间用UNION ALL相连
SELECT DISTINCT 2 AS TAG,--指定二级层级序号2
1 AS PARENT,--父级序号是序号为1的层级
NULL,--在层级的代码中已列出了所有层级元素和属性命名,因此这里给元素和属性做赋值。这句语句对应层级代码中“NULL AS '班级信息!1!'”,说明我希望该元素作为独立成行的标签,没有赋值。
班级,--对层级中的“NULL AS '班级信息!2!班级'”赋值,将xmlTest表中的班级赋值给属性班级
班级类型,--对层级中的“NULL AS '班级信息!2!班级类型'”赋值,将xmlTest表中的班级赋值给属性班级类型
班主任,--同上
NULL,--这句语句开始对应的是层级的属性,因此在层级的代码中不做赋值,在下面层级的代码中做赋值
NULL,
NULL,
NULL
FROM xmlTest--指出上面赋值的数据源来自于xmlTest表
UNION ALL--各个层级之间用UNION ALL连接
SELECT 3 AS TAG,--指定3级层级序号3
2 AS PARENT,--父级是序号为2的层级
NULL,--对应层级的”NULL AS '班级信息!1!'“语句,不希望它有值,所以不做赋值
NULL,--这三个NULL对应层级的各个属性,在层级的代码中已经做过赋值,因此在这里不做赋值
NULL,
NULL,
学号,--对应层级1代码中的层级3属性,在层级代码3中进行赋值
学生姓名,
性别,
年级总分
FROM xmlTest
FOR XML EXPLICIT;--将上述查询转换为XML,不能漏掉,否则结果会以表格形式显示

询问结果如图所示
图片 13
图片 14
在结果图中大家开掘,红框中3个班级音讯列在一块儿,而持有学生都列在高级中学一年级3班下,那不是大家想要的结果,大家希望每一种班级对应本人的学生。那么怎样消除此类难点吧,那关乎到排序。

注:如若层级中有多个数据完全重复,能够在该层级对应的代码前加DISTINCT关键字去除重复成分。

第一删除代码行末的FO库罗德 XML
EXPLICIT语句,仅仅实施剩下的部分,使结果以表格方式显示,那么结果如下
图片 15
这一个表格每行的一一也代表了该表格转化为XML文书档案后内容体现顺序。图中层级2(TAG=2)的几行,地方都在同步,那也正是为什么层级3的装有数据都在高级中学一年级3班上面了。我们供给对表格每行的一一举办调解,使学生所在行依照xmlTest表中的数据逻辑分散在班级行之下。不过总部方的报表发掘,不管遵照什么字段排序,都不恐怕落功能果。
科学代码如下

SELECT DISTINCT 1 AS TAG,
NULL AS PARENT,
NULL AS '班级信息!1!',
NULL AS '班级信息!2!班级',
NULL AS '班级信息!2!班级类型',
NULL AS '班级信息!2!班主任',
NULL AS '学生信息!3!学号!Element',
NULL AS '学生信息!3!学生姓名!Element',
NULL AS '学生信息!3!性别!Element',
NULL AS '学生信息!3!总分!Element'
UNION ALL
SELECT DISTINCT 2 AS TAG,
1 AS PARENT,
NULL,
班级,
班级类型,
班主任,
NULL,
NULL,
NULL,
NULL
FROM xmlTest
UNION ALL
SELECT 3 AS TAG,
2 AS PARENT,
NULL,
班级,
班级类型,
班主任,
学号,
学生姓名,
性别,
年级总分
FROM xmlTest
ORDER BY [班级信息!2!班级],[学生信息!3!学号!Element]
FOR XML EXPLICIT;

比较之下第2回代码,大家发掘上边包车型地铁代码不独有在行末对数码按成分属性进行了排序,还在赋值的代码中享有改动。在层级1代码中全然没有更换,因为层级1的代码功能是设置XML格式的,对数码排序没有影响。在底下多少个层级的赋值部分,每一个层级的代码中都对地点多少个层级的因素重复赋值,那样做使结果的报表中不再有那么多属性值是NULL,能够方便排序。最终再依据成分[班级新闻!2!班级]和[学员音信!3!学号!Element]排序。让我们看看结果什么。
运转方面包车型大巴代码,但不运营FOKoleos XML
EXPLICIT语句,看看表格中数量内容和行顺序是或不是变动
图片 16
如图所示,开掘行数据和学员数量的逐个呈现精确。运维具备代码得到XML文书档案,结果如图所示
图片 17
出于XML文书档案内容过长,不贴图了,直接复制全体XML内容呈现一下。

<班级信息>
  <班级信息 班级="高一1班" 班级类型="创新班" 班主任="李玉虎">
    <学生信息>
      <学号>20180101</学号>
      <学生姓名>李华</学生姓名>
      <性别>男</性别>
      <总分>5.680000000000000e+002</总分>
    </学生信息>
    <学生信息>
      <学号>20180103</学号>
      <学生姓名>孙丽</学生姓名>
      <性别>女</性别>
      <总分>3.390000000000000e+002</总分>
    </学生信息>
    <学生信息>
      <学号>20180108</学号>
      <学生姓名>吴伟</学生姓名>
      <性别>男</性别>
      <总分>5.280000000000000e+002</总分>
    </学生信息>
  </班级信息>
  <班级信息 班级="高一2班" 班级类型="重点班" 班主任="姜杰">
    <学生信息>
      <学号>20180102</学号>
      <学生姓名>张三</学生姓名>
      <性别>男</性别>
      <总分>6.270000000000000e+002</总分>
    </学生信息>
    <学生信息>
      <学号>20180104</学号>
      <学生姓名>袁康</学生姓名>
      <性别>男</性别>
      <总分>4.820000000000000e+002</总分>
    </学生信息>
    <学生信息>
      <学号>20180106</学号>
      <学生姓名>赵四</学生姓名>
      <性别>男</性别>
      <总分>5.680000000000000e+002</总分>
    </学生信息>
  </班级信息>
  <班级信息 班级="高一3班" 班级类型="提高班" 班主任="师从光">
    <学生信息>
      <学号>20180105</学号>
      <学生姓名>王婷</学生姓名>
      <性别>女</性别>
      <总分>7.610000000000000e+002</总分>
    </学生信息>
    <学生信息>
      <学号>20180107</学号>
      <学生姓名>周其</学生姓名>
      <性别>女</性别>
      <总分>3.480000000000000e+002</总分>
    </学生信息>
    <学生信息>
      <学号>20180109</学号>
      <学生姓名>甄诚</学生姓名>
      <性别>女</性别>
      <总分>7.020000000000000e+002</总分>
    </学生信息>
  </班级信息>
</班级信息>

将方面的结果比较一下原始xmlTest表,看看每一个班级和它下属学生的层级关系是还是不是有误。

注:写FO奥迪Q7 XML
EXPLICIT代码要注意,层级1的代码中先安装层级结构,不要先急着赋值。在下属层级的代码中对层级第11中学的代码进行赋值,最佳重复赋值,不然就能油不过生文中的排序难题。假设某些层级现身重复数据,在该层级的代码前加DISTINCT关键字。消除排序问题最佳的点子是对一一层级的习性重复赋值并在终极用OQashqaiDER
BY按层级属性排序。

精心观看地点的XML文书档案,发掘总分属性的值是个float类型,要把它调换到int,只必要把层级3中对总分的赋值代码改成CAST(年级总分
AS int)
图片 18

<!-- A list of current clients -->
<People>
<Person id="1234">
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Person>
<Person id="5678">
<FirstName>Jane</FirstName>
<LastName>Doe</LastName>
</Person>
</People>

该查询应生成以下输出:

导言

FOR XML PATH

PATH格局提供了一种较轻巧的方法来混合成分及质量。在PATH情势中,列名或列外号被看做XPATH表明式来拍卖,那一个表明式钦赐了什么将值映射到XML中。默许景况下,PATH情势为每一种自动生成

 


100
King
24000


101
Kochhar
17000


102
De Haan
17000

SQL Server 二〇〇七中的XML数据类型

从不称谓的列

下边介绍一种简单的FOCR-V XML PATH应用措施

SELECT 2+3 FOR XML PATH;--将2+3的值转换成xml格式

查询结果如图所示
图片 19

注:若是提供了空字符串FO奥迪Q7 XML PATH(‘’)则不会变卦任何因素。

SELECT 2+3 FOR XML PATH('');--将2+3的值转换成xml格式并去掉<row>

查询结果如图所示
图片 20
示例12:利用xmlTest表和mainTeacher表查询出xmlTest表中成就>=700分的上学的小孩子的班CEO消息和学员信息,并转账成XML格式
XmlTest表数据如下图所示
图片 21
MainTeacher表数据如下图所示
图片 22
实行上边包车型大巴说话

SELECT xmlTest.学号 AS '学生信息/@学号',--@符号表示该名称为属性名,斜杠表示子层级
xmlTest.学生姓名 AS '学生信息/@姓名',
xmlTest.班级 AS '学生信息/@班级',
mainTeacher.姓名 AS '学生信息/班主任信息/姓名',
mainTeacher.教师编号 AS '学生信息/班主任信息/教师编号',
mainTeacher.性别 AS '学生信息/班主任信息/性别',
mainTeacher.年龄 AS '学生信息/班主任信息/年龄',
mainTeacher.联系电话 AS '学生信息/班主任信息/联系电话'
FROM xmlTest,mainTeacher
WHERE xmlTest.年级总分>=700
AND xmlTest.班主任=mainTeacher.姓名
FOR XML PATH('result');--将根目录名改为result

查询结果如下所示

<result>
  <学生信息 学号="20180105" 姓名="王婷" 班级="高一3班">
    <班主任信息>
      <姓名>师从光</姓名>
      <教师编号>83928182</教师编号>
      <性别>男</性别>
      <年龄>28</年龄>
      <联系电话>15963002120</联系电话>
    </班主任信息>
  </学生信息>
</result>
<result>
  <学生信息 学号="20180109" 姓名="甄诚" 班级="高一3班">
    <班主任信息>
      <姓名>师从光</姓名>
      <教师编号>83928182</教师编号>
      <性别>男</性别>
      <年龄>28</年龄>
      <联系电话>15963002120</联系电话>
    </班主任信息>
  </学生信息>
</result>

接下去大家看看哪些定义多少个XML的列

在下边包车型大巴例子中,笔者将创造三个厂家客商的表,表中蕴藏了ID和各样厂家的客商音讯。

USE AdventureWorks2008R2
GO
IF OBJECT_ID('dbo.StoreClients') IS NOT NULL
DROP TABLE dbo.StoreClients
GO
CREATE TABLE dbo.StoreClients
(
StoreID INT IDENTITY PRIMARY KEY,
ClientInfo XML NOT NULL
)
GO

接下去插入数据到这么些表中,包蕴XML的文书档案和局地。小编将宣示一个XML的变量,然后用那个变量插入这几个文书档案到表的数据行里面。

DECLARE @ClientList XML
SET @ClientList =
'<?xml version="1.0" encoding="UTF-8"?>
<!-- A list of current clients -->
<People>
<Person id="1234">
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Person>
<Person id="5678">
<FirstName>Jane</FirstName>
<LastName>Doe</LastName>
</Person>
</People>'
INSERT INTO dbo.StoreClients (ClientInfo)
VALUES(@ClientList)
GO

固然变量将全方位XML文书档案插入了进去,然则它是被当做叁个纯净的值插入到表列里面来。

相比以上所述,创设和插入都是很直接省略的,接下去大家看一下怎么样创设三个XML的参数

概念叁个XML参数

例如,我定义@StoreClients 作为贰个输入参数,何况配备它为XML的品类

USE AdventureWorks2008R2
GO
IF OBJECT_ID('dbo.AddClientInfo', 'P') IS NOT NULL
DROP PROCEDURE dbo.AddClientInfo
GO
CREATE PROCEDURE dbo.AddClientInfo
@StoreClients XML
AS
INSERT INTO dbo.StoreClients (ClientInfo)
VALUES(@StoreClients)
GO

下一场大家再看看在仓库储存进程中哪些选拔XML作为参数:

DECLARE @ClientList XML
SET @ClientList =
'<?xml version="1.0" encoding="UTF-8"?>
<!-- A list of current clients -->
<People>
<Person id="1234">
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Person>
<Person id="5678">
<FirstName>Jane</FirstName>
<LastName>Doe</LastName>
</Person>
</People>'
EXEC dbo.AddClientInfo @ClientList

经过也是很直白,先将XML数据赋值给变量,然后将变量作为参数施行SP,那是查询你会发觉数目现已在表中了。

今天我们要学习一下XML类型扶助的主意:query(``), value().

在那以前大家要知道一种表明式,正是XQuery,它是一种强大的脚本语言,用来博取XML的数据。SQLServer
支持这种语言的子集,所以大家能应用这种语言的表明式来寻找和修改XML的数额。

在以上 XQuery 中,fn:doc XQuery 函数用于访谈 Oracle XML DB
音信库中存款和储蓄的单个 XML 文书档案。但只要要拍卖部分具有一样或貌似结构的 XML
文档(存款和储蓄在同一 XML
消息库文件夹中),应该如何做?这种情景下,另三个用以拍卖 XML
音讯库能源的 XQuery 函数(即
fn:collection)或者会派上用场。本文稍后将介绍多少个有关怎样使用
fn:collection XQuery 函数的现身说法。

品种化vs.非类型化的XML数据类型

TYPE命令

SQL Server帮忙TYPE命令将FOPAJERO XML的查询结果作为XML数据类型再次回到。
示例13:依旧是地点的例子,将查询结果作为XML数据类型再次回到。

CREATE TABLE xmlType(xml_col XML);
--首先创建一个表xmlType,只有一列xml数据类型的xml_col
INSERT INTO xmlType
SELECT(--将上面的查询语句全部复制到括号中,末尾加上TYPE,表示将XML文档作为xml数据类型,并插入到表xmlType中
SELECT xmlTest.学号 AS '学生信息/@学号',
xmlTest.学生姓名 AS '学生信息/@姓名',
xmlTest.班级 AS '学生信息/@班级',
mainTeacher.姓名 AS '学生信息/班主任信息/姓名',
mainTeacher.教师编号 AS '学生信息/班主任信息/教师编号',
mainTeacher.性别 AS '学生信息/班主任信息/性别',
mainTeacher.年龄 AS '学生信息/班主任信息/年龄',
mainTeacher.联系电话 AS '学生信息/班主任信息/联系电话'
FROM xmlTest,mainTeacher
WHERE xmlTest.年级总分>=700
AND xmlTest.班主任=mainTeacher.姓名
FOR XML PATH('result'),TYPE
);
SELECT * FROM xmlType;--查询xmlType表

询问结果如图所示
图片 23
双击张开查看XML

<result>
  <学生信息 学号="20180105" 姓名="王婷" 班级="高一3班">
    <班主任信息>
      <姓名>师从光</姓名>
      <教师编号>83928182</教师编号>
      <性别>男</性别>
      <年龄>28</年龄>
      <联系电话>15963002120</联系电话>
    </班主任信息>
  </学生信息>
</result>
<result>
  <学生信息 学号="20180109" 姓名="甄诚" 班级="高一3班">
    <班主任信息>
      <姓名>师从光</姓名>
      <教师编号>83928182</教师编号>
      <性别>男</性别>
      <年龄>28</年龄>
      <联系电话>15963002120</联系电话>
    </班主任信息>
  </学生信息>
</result>
注意:

因为XQuery是一种极其复杂的语言,我们只是提到了一片段她的机件,假使想要更进一竿的敞亮它什么利用,请查看MSDN XQuery
language
reference.

那我们明天先来通过例子来看一下query()和value
多个法子是如何利用XML数据的。需求介意的是自身接下去的测量检验意况是SQLServer2008LAND2。实例中蕴藏了ClientDB
数据库、ClientInfoCollection 的XML数据以及ClientInfo 表。

USE master;
GO

IF DB_ID('ClientDB') IS NOT NULL
DROP DATABASE ClientDB;
GO

CREATE DATABASE ClientDB;
GO

USE ClientDB;
GO

IF OBJECT_ID('ClientInfoCollection') IS NOT NULL
DROP XML SCHEMA COLLECTION ClientInfoCollection;
GO

CREATE XML SCHEMA COLLECTION ClientInfoCollection AS 
'<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns="urn:ClientInfoNamespace" 
targetNamespace="urn:ClientInfoNamespace" 
elementFormDefault="qualified">
  <xsd:element name="People">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Person" minOccurs="1" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="FirstName" type="xsd:string" minOccurs="1" maxOccurs="1" />
              <xsd:element name="LastName" type="xsd:string" minOccurs="1" maxOccurs="1" />
              <xsd:element name="FavoriteBook" type="xsd:string" minOccurs="0" maxOccurs="5" />
            </xsd:sequence>
            <xsd:attribute name="id" type="xsd:integer" use="required"/>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>';
GO

IF OBJECT_ID('ClientInfo') IS NOT NULL
DROP TABLE ClientInfo;
GO

CREATE TABLE ClientInfo
(
  ClientID INT PRIMARY KEY IDENTITY,
  Info_untyped XML,
  Info_typed XML(ClientInfoCollection)
);

INSERT INTO ClientInfo (Info_untyped, Info_typed)
VALUES
(
  '<?xml version="1.0" encoding="UTF-8"?>
  <People>
    <Person id="1234">
      <FirstName>John</FirstName>
      <LastName>Doe</LastName>
    </Person>
    <Person id="5678">
      <FirstName>Jane</FirstName>
      <LastName>Doe</LastName>
    </Person>
  </People>',
  '<?xml version="1.0" encoding="UTF-8"?>
  <People xmlns="urn:ClientInfoNamespace">
    <Person id="1234">
      <FirstName>John</FirstName>
      <LastName>Doe</LastName>
    </Person>
    <Person id="5678">
      <FirstName>Jane</FirstName>
      <LastName>Doe</LastName>
    </Person>
  </People>'
);

Listing 1: 创造测量试验景况和数码

查询 XMLType 数据

XML数据类型的法门

FOOdyssey XML的嵌套查询

示例14:在演示12的查询结果中询问班老董联系电话

SELECT (
SELECT xmlTest.学号 AS '学生信息/@学号',
xmlTest.学生姓名 AS '学生信息/@姓名',
xmlTest.班级 AS '学生信息/@班级',
mainTeacher.姓名 AS '学生信息/班主任信息/姓名',
mainTeacher.教师编号 AS '学生信息/班主任信息/教师编号',
mainTeacher.性别 AS '学生信息/班主任信息/性别',
mainTeacher.年龄 AS '学生信息/班主任信息/年龄',
mainTeacher.联系电话 AS '学生信息/班主任信息/联系电话'
FROM xmlTest,mainTeacher
WHERE xmlTest.年级总分>=700
AND xmlTest.班主任=mainTeacher.姓名
FOR XML PATH('result'),TYPE).query('result/学生信息/班主任信息/联系电话') AS '优秀教师联系方式';

SELECT里面依旧沿用了示范第13中学被套用的代码,外面用了query方法,查询结果如下图所示
图片 24

<联系电话>15963002120</联系电话>
<联系电话>15963002120</联系电话>

The XML query() Method

query方法,平日被用来回到二个点名XML子集的无类型的XML实例,如下,用括号加单引号来贯彻表明式,语法:

db``_object``.query('``xquery_exp``')

当我们调用那么些格局时,用实际数据库对象替换掉引号内的表明式。通超过实际例来比较一下结出有何不等同。

SELECT Info_untyped.query('/People')
  AS People_untyped
FROM ClientInfo;

Listing 2: 使用query(``) 来获得<People>元素中的值

在这种意况下,将回来标签下具备的因素,满含子元素属性以及它们的值。

<People>
  <Person id="1234">
    <FirstName>John</FirstName>
    <LastName>Doe</LastName>
  </Person>
  <Person id="5678">
    <FirstName>Jane</FirstName>
    <LastName>Doe</LastName>
  </Person>
</People>

Listing 3: 结果集重返了/People 的内容

假如计划找出类型化的列中的<People>
成分的开始和结果,笔者急需修改XQuery的表达式。如Listing 4

SELECT Info_typed.query(
  'declare namespace ns="urn:ClientInfoNamespace";
  /ns:People') AS People_typed
FROM ClientInfo;

Listing 4: 使用query(``)
来检索类型化的XML列,然后你运维这些讲话,就能获得结果如Listing5

<People xmlns="urn:ClientInfoNamespace">
  <Person id="1234">
    <FirstName>John</FirstName>
    <LastName>Doe</LastName>
  </Person>
  <Person id="5678">
    <FirstName>Jane</FirstName>
    <LastName>Doe</LastName>
  </Person>
</People>

Listing 5: 体现结果

如上,大家发掘二种结果是很周边的,独一的区分正是类型化的列里面富含了事关的命名空间。

只要我们打算获得子下一流,子成分的内容,大家需求修改表明式,通过增多/Person
到路线名称中,如下:

SELECT 
  Info_untyped.query(
    '/People/Person') AS People_untyped,
  Info_typed.query(
    'declare namespace ns="urn:ClientInfoNamespace";
    /ns:People/ns:Person') AS People_typed
FROM ClientInfo;

Listing 6: 检索 <Person> 元素

<Person id="1234">
  <FirstName>John</FirstName>
  <LastName>Doe</LastName>
</Person>
<Person id="5678">
  <FirstName>Jane</FirstName>
  <LastName>Doe</LastName>
</Person>

Listing 7: 那么些结果集是非类型化数据的结果

<ns:Person xmlns:ns="urn:ClientInfoNamespace" id="1234">
  <ns:FirstName>John</ns:FirstName>
  <ns:LastName>Doe</ns:LastName>
</ns:Person>
<ns:Person xmlns:ns="urn:ClientInfoNamespace" id="5678">
  <ns:FirstName>Jane</ns:FirstName>
  <ns:LastName>Doe</ns:LastName>
</ns:Person>

Listing 8: 那些结果集是类型化数据的结果

设若我们准备去获得钦点的<Person>下面的某一个元素,需要加入涉及的id属性。下面对比类型和非类型的两种情况下指定元素属性时如何获取。

SELECT 
  Info_untyped.query(
    '/People/Person[@id=1234]') AS People_untyped,
  Info_typed.query(
    'declare namespace ns="urn:ClientInfoNamespace";
    /ns:People/ns:Person[@id=5678]') AS People_typed
FROM ClientInfo;

Listing 9: 检索数据,钦定成分

前方的从未有过调换,遵照成分来增多表明式,然后用中括号,在中括号内增多了@id的值,结果如下

<Person id="1234">
  <FirstName>John</FirstName>
  <LastName>Doe</LastName>
</Person>

Listing 10: id为1234非类型化数据结果重回值。

对此类型化的列,作者动用的id为5678.留意,此次不再要求在性质名称前增进命名空间的前缀了,只需求在要素名字前引述就够用了。

<ns:Person xmlns:ns="urn:ClientInfoNamespace" id="5678">
  <ns:FirstName>Jane</ns:FirstName>
  <ns:LastName>Doe</ns:LastName>
</ns:Person>

Listing 11: id为5678的数额结果

更进一竿的来得结果,向下一级

SELECT 
  Info_untyped.query(
    '/People/Person[@id=1234]/FirstName') AS People_untyped,
  Info_typed.query(
    'declare namespace ns="urn:ClientInfoNamespace";
    /ns:People/ns:Person[@id=5678]/ns:FirstName') AS People_typed
FROM ClientInfo;

结果

<FirstName>John</FirstName>

<ns:FirstName xmlns:ns="urn:ClientInfoNamespace">Jane</ns:FirstName>

Listing 14: 名字的结果的显示

道理当然是这样的还能通过数字索引的秘技显示:

SELECT 
  Info_untyped.query(
    '/People/Person[1]/FirstName') AS People_untyped,
  Info_typed.query(
    'declare namespace ns="urn:ClientInfoNamespace";
    /ns:People/ns:Person[2]/ns:FirstName') AS People_typed
FROM ClientInfo;

Listing 15: 使用数字索引来引用成分下的结果

XQuery 让你能够操作基于 XML
情势以及非基于情势的数额。以下示例演示了怎样采用 XMLTable 函数从 OE
演示数据库形式中询问基于 PurchaseOrder XML 形式的 XMLType 表。

XQuery入门

XML索引

是因为XML数据类型最大可存款和储蓄2GB的数据,因而必要创造XML索引来优化查询质量。

XML的value()方法

就不啻query()方法一致便捷,相当多时候当你想去检索叁个一定的要素或性质的时候,并不是收获XML的成分,那就可以使用value()了。这种方法只会回去多个特定的值,不作为数据类型。由此必须要传递多个参数XQuery表明式和T-SQL数据类型。上边看语法:

db``_object``.value('``xquery_exp``', '``sql_type``')

SELECT 
  Info_untyped.value(
    '(/People/Person[1]/FirstName)[1]', 
    'varchar(20)') AS Name_untyped,
  Info_typed.value(
    'declare namespace ns="urn:ClientInfoNamespace";
    (/ns:People/ns:Person[2]/ns:FirstName)[1]',
    'varchar(20)') AS Name_typed
FROM ClientInfo;

Listing 16: 检索<FirstName> 的值

在Listing16中,笔者钦命了[1]在Xquery表明式的后边,所以结果集将只回去第一个体的名字。

Name_untyped         Name_typed
-------------------- --------------------
John                 Jane

Listing 17: <FirstName>的两个结果

本来,大家也足以找出每种实例的id的属性值,而且钦命Int类型再次回到。

SELECT 
  Info_untyped.value(
    '(/People/Person/@id)[1]', 
    'int') AS Name_untyped,
  Info_typed.value(
    'declare namespace ns="urn:ClientInfoNamespace";
    (/ns:People/ns:Person/@id)[2]',
    'int') AS Name_typed
FROM ClientInfo;

Listing 19: 检索多少个实例的id属性值

Name_untyped         Name_typed
-------------------- --------------------
1234                 5678

Listing 20: 重临三个id的质量

除此之外在表达式中定义你的XQuery表明式,你也能会集的效率来进一步定义你的询问和操作数据。比如,count()成效,大家来博取每一种列中<Person>
元素的个数。

SELECT 
  Info_untyped.value(
    'count(/People/Person)', 
    'int') AS Number_untyped,
  Info_typed.value(
    'declare namespace ns="urn:ClientInfoNamespace";
    count(/ns:People/ns:Person)',
    'int') AS Number_typed
FROM ClientInfo;

Listing 21: 使用count功效来寻觅成分个数

结果如下:

Number_untyped Number_typed
-------------- ------------
2              2

Listing 22: 每列数据中<Person> 元素的数据

除此以外四个常用的功效是concat(``),
它能够再三再四几个或五个XML成分下的数额。你能够钦点你想连接的每三个部分。示例:

SELECT 
  Info_untyped.value(
    'concat((/People/Person/FirstName)[2], " ", 
      (/People/Person/LastName)[2])', 
    'varchar(25)') AS FullName
FROM ClientInfo;

Listing 23: 使用concat(``)来连接数值

FullName
-------------------------
Jane Doe

Listing 24: 连接后的再次来到值

名和姓被连接起来,组成三个单纯的值。都来源于于同一个<Person>
下,当然也能够来自不相同。

SELECT ttab.COLUMN_VALUE AS OrderTotal FROM purchaseorder,
XMLTable(
'for $i in /PurchaseOrder
where $i/User = "EABEL"
return;

{$i/Reference}

{fn:sum(for $j in $i/LineItems/LineItem/Part
return ($j/@Quantity*$j/@UnitPrice))}

'
PASSING OBJECT_VALUE
) ttab;

XPath2.0简介

主XML索引

主XML索引对XML列中XML实例内的持有标志,值和路径举行索引。创造主XML索引时,相应XML列所在的表必得对该表的主键创制了集中索引。

总结

 

我们比相当多精通了XML在SQLServer
中的简单利用,从概念到利用格局。也来看了query()检索子集,也能使用value()检索独立的成分属性的值。当然除此而外还恐怕有向exist(``)
andnodes()
那样方法,合作语法都是应用,那有的就不再举行讲了,大同小异。有不知晓的能够私聊。越来越多利用格局还请访谈MSDN来赢得(搜索XQuery
language reference)。

在以上示例中,您在 XMLTable 函数的 PASSING 子句中动用 OBJECT_VALUE
虚构列将 purchaseorder 表作为左右文项传递给这里使用的 XQuery
表明式。XQuery 表明式计算客商 EABEL
伏乞的各种购买订单的合计,并为管理的种种订单生成三个 OrderTotal XML
成分。要会见生成的 XML,请使用 SELECT 列表中的 COLUMN_VALUE
虚构列。最后的输出应如下所示:

XQuery简介

辅助XML索引

为了加强主XML索引的属性,能够制造支持XML索引。仅有创造了主XML索引后技术制造帮助XML索引。扶助XML索引分3种:PATH,VALUES和PROPERTY帮助XML索引。

ORDERTOTAL
-------------------------------------------------------------

EABEL-20021009123338324PDT
1328.05


EABEL-20021009123335791PDT
2067.15


EABEL-20021009123336251PDT
289.6


EABEL-20021009123336382PDT
928.92

XQuery的优点

创办索引

为表中某些列成立索引,须要该列是XML数据类型。

ALTER TABLE Student
ADD xml_test XML;--对Student表添加一个XML数据类型字段xml_test
--对Student表的xml_test字段创建主XML索引,命名为学生信息表
CREATE PRIMARY XML INDEX 学生信息表
ON Student(xml_test)
GO
--对Student表的xml_test字段创建PATH辅助XML索引,记得写上主索引名
CREATE XML INDEX 辅助学生信息表
ON Student(xml_test)
USING XML INDEX 学生信息表 FOR PATH
GO

注:协助索引的命名无法与主索引同样。

要博取同样的末梢结出,能够改用 XMLQuery 函数。但只要将上叁个演示中采取的
XQuery 表明式参数字传送递给 XMLQuery(如下所示):

XQuery的应用领域

修改和删除索引(ALTEKuga INDEX 和 DROP INDEX)
ALTER INDEX ALL ON Student--重建所有索引
REBUILD WITH(FILLFACTOR=80,SORT_IN_TEMPDB=ON,STATISTICS_NORECOMPUTE=ON);
--删除索引
DROP INDEX 学生信息表 ON Student
GO

注:删除主索引,与其唇揭齿寒的持有援救索引也会被删除。由此地点语句中除去学生音信表索引后,援助学生音讯表索引也被删去了。

SELECT XMLQuery('for $i in /PurchaseOrder
where $i/User eq "EABEL"
return 
{$i/Reference}

{fn:sum(for $j in $i/LineItems/LineItem/Part
return ($j/@Quantity*$j/@UnitPrice))}

'
PASSING OBJECT_VALUE
RETURNING CONTENT)
FROM purchaseorder;

在劳务器端使用XQuery的帮助和益处

OPENXML函数

OPENXML是贰个行集函数,用于检索XML文书档案。在试用OPENXML函数在此以前,一定要先用系统存款和储蓄进度sp_xml_preparedocument浅析文书档案,该存款和储蓄进度在深入分析完XML文书档案后会再次回到七个句柄,使用OPENXML检索文书档案时要将该句柄作为参数字传送给OPENXML。
示例15

--定义两个变量@Student和@StudentInfo
DECLARE @Student int
DECLARE @StudentInfo xml
--使用SET为@StudentInfo赋值
SET @StudentInfo='
<row>
<姓名>祝红涛</姓名>
<班级编号>2019382910</班级编号>
<成绩>89</成绩>
<籍贯>沈阳</籍贯>
</row>
'
--使用系统存储过程sp_xml_preparedocument分析由@Student变量表示的XML文档,将分析得到的句柄赋值给@Student变量
EXEC sp_xml_preparedocument @Student OUTPUT,@StudentInfo
--在SELECT语句中使用OPENXML函数返回行集中的指定数据
SELECT * FROM OPENXML(@Student,'/row',2)
WITH(
姓名 varchar(8),
班级编号 varchar(10),
成绩 int,
籍贯 varchar(20)
);

结果如图所示
图片 25
在上述语句中,sp_xml_preparedocument存款和储蓄进度语句用了2个参数,在那之中@Student是三个int型变量,该存款和储蓄进度会将句柄存款和储蓄在@Student变量中作为结果数据,@StudentInfo是一个XML类型的变量,存款和储蓄了将在实行解析的XML文书档案。
OPENXML函数的言语中,使用了3个参数,在那之中@Student代表已经经过sp_xml_preparedocument存储进程剖析的文书档案的句柄,’/row’使用XPath形式提供了一个路线,代表要赶回XML文书档案中该路径下的数量行,2是三个可选数据参数,表示将那一个数量行以成分为主干映射。

则 XQuery 表明式再次来到的空系列将与 purchaseorder
表联接,进而包涵在询问总计果集中。实际上,那表示输出将不止含有为客户EABEL 诉求的订单生成的 OrderTotal 成分,而且还隐含为 purchaseorder
表中存款和储蓄的具有别的订单生成的空行(暗中认可景况下,purchaseorder 表包含 132
行)。从结果聚焦清除空行的办法之一是在 SELECT 语句的 WHERE 子句中使用
existsNode SQL 函数,并不是在 XQuery 表达式中应用 WHERE 子句,如下所示:

当使用XML Schemas时怎么推行XQuery

SELECT XMLQuery('for $i in /PurchaseOrder
return 
{$i/Reference}

{fn:sum(for $j in $i/LineItems/LineItem/Part
return ($j/@Quantity*$j/@UnitPrice))}

'
PASSING OBJECT_VALUE
RETURNING CONTENT) AS ordertotal
FROM purchaseorder
WHERE existsNode(OBJECT_VALUE, '/PurchaseOrder[User = "EABEL"]') = 1;

XQuery表达式的构造

上述查询与本有的起初的 XMLTable 示例生成一样的出口。

XPath 2.0表达式

询问 Oracle XML DB 消息库中的 XML 数据

FLWOR语句

为访谈 Oracle XML DB 新闻库中蕴藏的 XML 数据,Oracle XQuery 引入了
fn:doc 和 fn:collection XQuery 函数。使用 fn:doc,您能够查询 XML
新闻库中积累的单个 XML 文书档案,而 fn:collection
使您可以访问同一消息库文件夹中蕴藏的多个 XML 文书档案。

For

正如本文从前(参阅使用关周详据构建 XML部分)介绍的演示所示范,使用
fn:doc 非常简单直接。它获得表示音信库文件能源 (U普拉多I) 的字符串并回到该 U帕杰罗I
指向的文书档案。要打听 fn:collection XQuery
函数的意义,同一文件夹中足足应该四个消息库文件。假诺已经运营了列表 1中的代码,则早已创制了 /public/employees 新闻库文件夹并在其间蕴藏了
employees.xml 文件。由此,您将需求在该公文夹中最少更创造贰个 XML
文件,然后技能试用 fn:collection。列表 2 中的 PL/SQL 代码基于
SCOTT/TIGE昂科威 演示数据库形式的 dept 和 emp 表存款和储蓄的关全面据营造XML,然后将转换的 XML 文书档案作为 acc_dept.xml 保存到 /public/employees
新闻库文件夹。要运转列表 2 中的 PL/SQL 进程,请保管以 SCOTT/TIGELAND的地方登陆。

Where

列表 2:基于关周详据构建 XML 并将其保存到 XML 消息库

order by

DECLARE
XMLdoc XMLType;
BEGIN
SELECT XMLQuery(
'for $j in ora:view("SCOTT", "dept")/ROW
where $j/DEPTNO = 10
return ( 
{$j/DEPTNO,
$j/DNAME}
 {
for $i in ora:view("SCOTT", "emp")/ROW
where $i/DEPTNO = $j/DEPTNO
return (

{$i/EMPNO,
$i/ENAME,
$i/SAL}
)} 

)'
RETURNING CONTENT) INTO XMLdoc FROM DUAL;
IF(DBMS_XDB.CREATERESOURCE('/public/employees/acc_dept.xml', XMLdoc)) THEN
DBMS_OUTPUT.PUT_LINE('Resource is created');
ELSE
DBMS_OUTPUT.PUT_LINE('Cannot create resource');
END IF;
COMMIT;
END;
/

return

此刻,/public/employees
消息库文件夹应富含四个公文:acc_dept.xml(由列表 2 中的 PL/SQL
代码生成)和 employees.xml 文件(由列表 1 中的代码生成)。由于这个 XML
文书档案存储在一样音讯库文件夹中,由此能够运用 fn:collection 函数访问多少个XML 文档中存储的职工新闻。然则,就算这一个 XML 文书档案均包涵职员和工人 XML
成分(那些要素实际上具有一样结构),但 XML 文书档案自己的布局迥然不一致。在
employees.xml 中,文档根成分为 EMPLOYEES,而 acc_dept.xml 将 DEPARTMENT
用作根成分。要消除此主题材料,可以通过 XQuery 使用 XPath // 构造,从而导航到
XML 文档中的有些节点,而毋庸内定该节点的适龄路线。以下示例演示了什么样在
XQuery 表明式中动用 XPath // 构造:

FLWOR表达式vs. XPath表达式

SELECT XMLQuery(
'for $i in fn:collection("/public/employees")//EMPLOYEE
where $i/SAL >= 5000
order by $i/ENAME
return;
$i'
RETURNING CONTENT) FROM DUAL;

XQuery的操作

该社团应生成以下输出:

数学生运动算符

102
De Haan
17000


7839
KING
5000


100
King
24000


101
Kochhar
17000

正如运算符

您能够看出,以上输出包涵从 employees.xml 和 acc_dept.xml 中获得的职工
XML 成分,那几个因素表示工资大于或等于 5,000 欧元的职员和工人。

平时来讲比较运算符

将 XML 分解为关周全据

数值相比较运算符

要是应用程序管理关周到据而非 XML,而你供给拜望的数码以 XML
格式存储,则将 XML
分解为关周到据或然会十二分管用。继续开展上有些的以身作则,您可以采用 SQL
函数 XMLTable 将职员和工人 XML 成分分解为虚构表的单个列,如下所示:

节点比较运算符

SELECT emps.empno,emps.ename, emps.sal FROM 
XMLTable(
'for $i in fn:collection("/public/employees")//EMPLOYEE
where $i/SAL >= 5000
return;
$i'
COLUMNS empno NUMBER PATH '/EMPLOYEE/EMPNO',
ename VARCHAR2(30) PATH '/EMPLOYEE/ENAME',
sal NUMBER PATH '/EMPLOYEE/SAL') emps;

节点顺序相比运算符

该查询将扭转以下输出:

逻辑操作符

EMPNO ENAME SAL
----- -------------- ----------
7839 KING 5000
100 King 24000
101 Kochhar 17000
102 De Haan 17000

if-then-else语句

询问外界数据源

使用XQuery构造XML

运用 XQuery,能够依照 XML 数据以及能够用 XML 表示的非 XML 数据生成 XML
文书档案,无论其岗位怎么:无论是存款和储蓄在数据库中、置于网址上、即时创立或然存款和储蓄在文件系统中。但要注意,Oracle
XML DB 为针对数据库中积存的数码开展的 XML
操作提供了老大高的习性和可伸缩性。因而,要是您能够完全调控所管理的数量,则最棒将它移动到数据库中。

XQuery构造器 vs. FOR XML语句

正如您从日前的示范中打听到的,在 Oracle XQuery 推行中,doc 和 collection
XQuery 函数用于访问 Oracle XML DB 音讯库中蕴藏的 XML 文书档案。能够通过
XMLTable 和 XMLQuery SQL 函数中的 PASSING
子句动态绑定外界数据源。思量以下示例。倘使你的小卖部要为那个从事于 XQ
项目标职员和工人花费奖金。因而,财务部发布了 empsbonus.xml
文件,其中蕴藏有资格猎取奖金的职员和工人列表以及该列表中输入的各样职工的奖金多寡。empsbonus.xml
文件可能如下所示:

XQuery内置函数

100
1200


101
1000

数据访谈

在实质上情形中,以上的 XML
文件或然置于网址上(因而得以通过互连网获得)、以文件方式积攒在本土文件系统中,或以文件财富方式积攒在
Oracle XML DB
音讯库中。就本示例来说,该公文位于网址上。为轻松起见,能够在目录(Web
服务器在当中存款和储蓄可从 Web
看见的文书档案)中创建叁个职工文件夹,然后在该公文夹中插入 empsbonus.xml
文件,以便能够经过以下 U卡宴L 访谈 empsbonus.xml 文件:

字符串的拍卖

http://localhost/employees/empsbonus.xml

汇集函数

接下去,若是您供给基于 empsbonus.xml
文书档案中寄存的数额创设贰个表格。在该报表中,您或然非但要蕴涵列表中显得的奖金多少以及各种职工的职工
ID,还要满含他/她的姓名。因而,能够率先应用以下查询生成一个新的 XML
文书档案(即便你以 H福特Explorer/H巴博斯 CL级 的地位连接):

左右文函数

SELECT XMLQuery(
'for $k in 1
return (
 {for $i in ora:view("employees")/ROW,
$j in $emps/EMPLOYEES/EMPLOYEE
where $i/EMPLOYEE_ID = $j/EMPNO
return (
{xs:string($i/EMPLOYEE_ID)}
{xs:string(fn:concat($i/FIRST_NAME, " ", $i/LAST_NAME))}
{xs:integer($j/BONUS)}
)} )'
PASSING xmlparse (document httpuritype
('http://localhost/employees/empsbonus.xml').getCLOB()) as "emps"
RETURNING CONTENT).getStringVal() as RESULT FROM DUAL;

关系项目表明式

上述查询是五个关于怎样运用 XQuery 基于 XML 和非 XML
数据(以分化的点子从分化的多少源中检索)生成 XML
文书档案的身体力行。具体来讲,使用 ora:view() 函数访问 HR 演示格局中的默许
employees 关系表,并使用 PASSING 子句中的 httpuritype() 函数借助于
HTTP 访谈 empsbonus.xml 文书档案。然后,在 FLWOR 表明式的 return
子句中创设新的 XML 文书档案。最终,将获得以下 XML 文书档案:

系列表明表明式


100
Steven King
1200


101
Neena Kochhar
1000

如for语句中的xs:TYPE

缓慢解决品质难点

品种检查表达式

正如您从前方的有的中询问到的,XQuery 是一种用于查询 Oracle 数据仓库储存款和储蓄的
XML 内容的快捷方法 – 无论你是拍卖地点存款和储蓄的 XMLType
数据或许查询基于关周到据创设的 XML
视图。但依靠对数据运用的仓库储存类型的不等,XQuery
表达式的实践性能大概南辕北辙不一样。尤其是,Oracle XML DB 能够优化基于由
ora:view 函数创造的 SQL/XML 视图而营造的 XQuery 表明式。对于 XMLType
表或列中积累的 XML 数据,只好对使用结构化(对象-关系)存款和储蓄技能存款和储蓄的基于
XML 方式的 XMLType 数据实行 XQuery 优化。

xs:TYPE实例

所选拔的蕴藏模型并不是是潜移暗化 XQuery
表明式实践品质的独步一时因素。在少数情状下,XQuery
表明式自身的协会也也许引致质量难题。要监察和控制 XQuery
表明式的个性,能够打字与印刷并检查关联的 EXPLAIN PLAN。在 SQL*Plus
中,只需安装 AUTOTRACE 系统变量,就可以打字与印刷 SQL
优化程序行使的施行路线。但要施行该操作,请保管成立 PLUSTRACE
剧中人物,然后将其授予连接到数据库所采纳的顾客。有关怎么着实行此操作的消息,请参阅
Oracle 数据库 10g 第 2 版 (10.2) 文书档案中《SQL\Plus
顾客指南和参照》一书中的“调度SQL\Plus”一章。以下示例演示了怎么通过检查 EXPLAIN PLAN
生成的实施安排来赢得收益。假如你已经将 PLUSTRACE 剧中人物赋予暗中同意顾客 OE,以
OE/OE 的身价登入并运转以下查询:

类型转换函数

SET AUTOTRACE ON EXPLAIN
SELECT count(*)
FROM oe.purchaseorder, XMLTable(
'for $i in /PurchaseOrder/User
where $i = "CJOHNSON"
return $i'
PASSING OBJECT_VALUE) ptab;

隐式类型调换

那将转移以下输出:

显式类型转变

COUNT(*)
----------
9
Execution Plan
---------------------------------------------
Plan hash value: 4046110317
--------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 226 | 29 (0) | 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 226 | | |
| 2 | NESTED LOOPS | | 10782 | 2379K | 29 (0) | 00:00:01 |
|* 3 | TABLE ACCESS FULL | PURCHASEORDER | 1 | 226 | 5 (0) | 00:00:01 |
| 4 | COLLECTION ITERATOR P| XMLSEQUENCEFROMX| | | | |
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter(SYS_CHECKACL("ACLOID","OWNERID",xmltype('...

值类型构造器

你或者对为上述查询生成的施行布署并不乐意。尤其是,所拍卖的行数大概那么些大。由于
SQL
调解的入眼对象是避免访谈对结果没有其余影响的行,因此可能要持续调解查询以优化品质。对查询中包涵的
XPath 表明式实行重新建模后,能够再一次重试它,如下所示:

cast as xs:TYPE ?操作符

SELECT count(*)
FROM oe.purchaseorder, XMLTable(
'for $i in /PurchaseOrder
where $i/User = "CJOHNSON"
return $i/User'
PASSING OBJECT_VALUE) ptab;
这次,输出应如下所示: 
COUNT(*)
----------
9
Execution Plan
---------------------------------------------------
Plan hash value: 3411896580
---------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 29 | 7 (0) | 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 29 | | |
| 2 | NESTED LOOPS | | 1 | 29 | 7 (0) | 00:00:01 |
| 3 | FAST DUAL | | 1 | | 2 (0) | 00:00:01 |
|* 4 | TABLE ACCESS FULL | PURCHASEORDER | 1 | 29 | 5 (0) | 00:00:01 |
Predicate Information (identified by operation id):
---------------------------------------------------
4 - filter("PURCHASEORDER"."SYS_NC00022$"='CJOHNSON' AND
SYS_CHECKACL("ACLOID","OWNERID",xmltype('...

拜望关系性的列和变量

你能够旁观,以上彰显的查询生成同样的终极结出,但它们的推行安插并不一致样。查看最终二个演示中的
XQuery 表明式,您只怕会小心到它迭代顶层 PurchaseOrder 成分,个中的每个PurchaseOrder 成分都意味依照 PurchaseOrder XMLType
方式的表中的一站式。那意味着实际上海重机厂写 XQuery
表明式,以迭带基础对象表(用于存款和储蓄分解的 PurchaseOrder
文书档案)中的行。与查询要迭代不表示基础表中的单个行的 XML
成分相比,该方法的习性更加好一些。

不援助的特征和行事中的应用方案

但在少数意况下,很难开采 XQuery
表明式的哪位构造将使一些查询的性质越来越好。那正是干什么最佳在开采阶段使用调解工具的缘由。

最棒实施和教导宗旨

将动态变量绑定到 XQuery 表达式

XML数据的退换

另一种能够肯定加强 XQuery
表达式施行质量的手艺是使用绑定动态变量。使用绑定变量(实际不是将变量串联为字符串)能够使
Oracle 重用 SQL 语句,进而减少深入分析花费并刚烈增进应用程序的性质。能够在
XMLQuery 和 XMLTable SQL 函数中运用 PASSING 子句将动态变量绑定到 XQuery
表明式。该技巧使你能够依附客商端代码中计算的参数动态生成 XML。列表 3
中的示例演示了什么样在从 PHP 脚本执行的 XQuery 查询中应用绑定变量。

插入操作

列表 3:使用绑定变量

除去操作符

//File:BindVars.php
$user = 'hr';
$pswd = 'hr';
$db ='(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))
)
(CONNECT_DATA=(SID=orclR2)(SERVER=DEDICATED))
)';
$empno=100;
$conn = oci_connect($user, $pswd, $db);
$sql = 'SELECT XMLQuery('."'".'for $i in ora:view("employees")/ROW
where $i/EMPLOYEE_ID = $empno
return (
{$i/EMPLOYEE_ID,
$i/EMAIL,
$i/JOB_ID}
)'."'".'PASSING XMLElement("empno", :empno) AS "empno"
RETURNING CONTENT).GetStringVal() AS RESULT FROM DUAL';
$query = oci_parse($conn, $sql);
oci_bind_by_name($query, ":empno", $empno, 3);
oci_execute($query);
oci_fetch($query);
$str = oci_result($query, 'RESULT');
print $str;
?>

Update操作符

列表 3 中体现的脚本应生成以下输出(注意,浏览器中恐怕不会议及展览示标志):

XQuery应用场景

100
SKING
AD_PRES

此情此景1:质量评价种类

XQuery 与 XSLT

场景2:病例系统

固然 Oracle 在 Oracle XML DB 中提供了多个自带 XSLT
管理器,但在好多情形下(尤其是在处理大型文书档案时),XQuery 对于创设 XML
越来越高速。其它,XQuery 表达式经常比为同一作业设计的 XSLT
样式表更具可读性,並且更明亮。与 XSLT 同样,XQuery 不但可用于将一个 XML
文书档案转变为另二个 XML 文书档案,并且还可用以将 XML
调换为另一种基于文本的格式,如 HTML 或 WML。

场景3:资金财产处理种类

在本文后面的询问 XMLType 数据部分中,您看见了贰个有关使用 XQuery 将一个XML 文书档案调换为另一个 XML 文书档案的示范。具体来讲,该示例使用 XQuery
表明式总括示例数据库情势 OE 的 purchaseorder
表中寄存的订单的订单一共,然后为拍卖的各类订单生成了三个 OrderTotal XML
成分。实际上,您能够利用 XSLT
实施同一操作。为此,您首先须要创制贰个使用于 PurchaseOrder XML 文书档案的
XSLT 样式表,以转移对应的 OrderTotal 成分。对于此示例,能够行使列表 4
中所示的 XSLT 样式表。

结论

列表 4:使用 XSLT 计算小计总和 (Quantity * UnitPrice)

导言

http://www.w3.org/1999/XSL/Transform" version="1.0">



























XML是被用来作为一种文书档案格式而更进一步起来的。可是,XML所具有的另外特征,举例可增添性、接济国际标准、表示结构化和半结构化数据的力量,以及人和机械对其大致的可读性,使得它成为一种布满应用的、平台毫无干系的数据表示格式。由于XML得到了宽广的承认,因而十分多顾客都用XML来缓慢解决复杂的商业贸易难题,举例那么些事关到数量集成的标题。有为数十分多案例都推荐将音讯一向存款和储蓄到XML文书档案,这比将音信先存到数据表中然后再将这几个消息整合XML新闻要管用的多。要翻看越来越多关于那么些案例的新闻,能够查看“微软SQLserver二〇〇七XML最棒试行”白皮书中相关文书档案。XML在积累文书档案和半结构化数据表示方面包车型地铁行使已经让XML发展成为一种能够在劳务器端存款和储蓄简单多少管理的数目存款和储蓄格式。

为便于起见,您也许需求将此 XSL
样式表保存在数据库中,然后再初叶利用它。举个例子,您能够将样式表作为文件财富保存在
Oracle XML DB
消息库中。试行该操作的方法之一是将样式表作为文件保留到地点文件系统中,然后使用以下某些互连网公约将它移动到
XML 音信库:FTP、HTTP 或 WebDAV。假若你已经将列表 4 中的 XSLT 样式表作为
orderTotal.xsl 保存在 /public
消息库文件夹中,今后可以按以下示例所示将它用作 XMLTransform SQL
函数的参数(假让你以 OE/OE 的身价登入):

 

SELECT XMLTRANSFORM(OBJECT_VALUE,
xdbUriType('/public/orderTotal.xsl').getXML()).GetStringVal() AS RESULT FROM
purchaseorder WHERE existsNode(OBJECT_VALUE, 
'/PurchaseOrder[User = "EABEL"]') = 1;

可是这种发展也导致了三个标题-从XML数据中领到出来的新闻要作为BLOBs类型存款和储蓄到关系型数据库中,要求一种查询语言来领取XML所抒发的新闻,并使其相符关系型数据库中的供给。Microsoft  SQL
Server  两千提供了OpenXML,它能够被用来查询,从被设计时,就满意了从XML数据映射到关系型数据格式的渴求,但它并不曾完全帮忙XML数据模型(见表1)。关周到据模型和XML数据模型在广大下边都分化样。下表简单列举了二种数据模型的关键分裂。

以上查询将管理客商 EABEL 央求的具备订单(即存款和储蓄在 XMLType 的默许PurchaseOrder 表中的订单)并将扭转与查询 XMLType 数据部分中的 XQuery
查询同一的出口。

 

将列表 4 中的 orderTotal XSLT 样式表与查询 XMLType
数据部分中的示例使用的 XQuery 表明式实行相比,您大概会小心到,XQuery
方法要比 XSLT 方法更具吸重力。最少在应用 XQuery
时,您只需编写比相当少的代码就能够获取一致的最终结果。

表1   关系型数据模型与XML数据模型之间的界别

查询 哈弗SS 音信提供

图片 26

出于 ENCORESS 音讯提供精神上是一个托管的 XML 文件(ENCORESS
新闻阅读器从中获得头条消息或任何剧情),由此能够像处理其余别的能够经过
Web 获得的 XML
文书档案那样来管理它。正如你在本文前边的询问外界数据源部分中所见,可以利用
XQuery 查询其余能够由此 URubiconL 访问的 XML。您通过 XMLTable 和 XMLQuery SQL
函数中的 PASSING 子句动态绑定全数外界 XML 数据源。以下是八个询问 陆风X8SS
消息提供的 XQuery 示例:

 

SELECT XMLQuery(
'for $i in $h//channel
return;

{$i/lastBuildDate}

{for $j in $h//item
where ora:contains($j, "PHP")
return  {($j/title, $j/link)}}

'
PASSING xmlparse (document httpuritype
('http://www.oracle.com/technology/syndication/rss_otn_news.xml').getCLOB()) as "h"
RETURNING CONTENT).getStringVal() as RESULT FROM DUAL;

 

该 XQuery 应生成五个 XML 文书档案,当中包涵 Oracle 技巧网 (OTN) 近来发表的与
PHP 本事有关的头条新闻列表。所生成的 XML 文书档案也许如下所示:

不仅加码拍卖越来越七种化的构造数据的需要和数据间隐含约束的必要性是扩充关系型数据模型以协理XML文书档案存款和储蓄的最根本的多少个原因。别的,SQL语言在拍卖半结构化或许标识音讯时的局限性也驱使了XQuery语言的上进。XQuery语言在筹划的时候曾经思虑到XML数据的特色和管理XML数据的连锁主题材料。

Tue, 01 Nov 2005 19:37:42 GMT


http://www.oracle.com/technology/xe


http://www.oracle.com/technology/pub/articles/oracle_php_cookbook


http://www.oracle.com/technology/tech/php/zendcore/index.html

SQL Server 二〇〇七透过内置XML数据类型帮忙XML数据的本地化存款和储蓄。XQuery
1.0版本是经World Wide Web Consortium (W3C)
XML查询职业组定义,基于XML数据的公式化查询语言。XQuery,像SQL同样,是一种证明性的询问语言,就疑似同大家在底下的篇章中将会看见的平等,能经过宗旨的SQL和XPath知识来轻易地驾驭它。

但在付出实际应用程序时,您将很恐怕必要 XQuery 表明式直接生成 HTML
标志,并不是唯有转移贰个如上所示的 XML
文书档案。那样,您便得以营造三个越来越灵敏、可维护性更加高的应用程序,原因是在这种景况下,所有陆风X8SS 管理(从提取要求的数码到将它包裹在 HTML
标识中)都将转移到数据库。那令你不用编写担当 奥德赛SS
管理的应用程序代码。实际上那表示你不用在诸如 SportageSS
新闻提供的协会已经改成的气象下修改应用程序代码。相反,您只需修改用于 EvoqueSS
管理的 XQuery 表明式。

正文基于XQuery 1.0在SQL Server 200第55中学的施行,同一时间也依照XQuery 1.0
二〇〇四年的专门的学业草图。本文的率先有的提议了新的XML数据类型的总述以及它的连锁特点,接下去的一对,分别地介绍XQuery的多级操作,XQuery的放置函数,关系型表明式,以及SQL
Server
二零零六不援救的有的。最终,介绍前段时间的极品应用和教导,XML数据的匡正以及XQuery的运用事例的音信。

总结

引用:

您已经在本文领悟到,XQuery
是三个综合的查询语言,它提供了一种用于查询、创设和转移 XML
数据的长足方法。就算 Oracle XQuery 实行令你能够操作任何能够用 XML
表示的数码(无论它存款和储蓄在数据库中、位于网址上也许存款和储蓄在文件系统中),但将管理的多寡移动到数据库中从来是二个正确的主意。对于数据库中储存的数目,Oracle
XML DB(对 XPath
重写使用一样机制)只好眼看优化管理那个基于以下数据营造的 XQuery
表明式:那一个数据包蕴关周到据、对象-关周到据或使用结构化(对象-关系)存款和储蓄本领存储的基于
XML 形式的 XMLType 数据。

SQL Server 2006中的XML数据类型

(小编:铭铭)

SQL Server
二〇〇五引进的新XML数据类型使得客户全部在数据库中存款和储蓄XML文书档案和段落的技术。多少个XML数据类型能够用来创设列,用来创建存储进程或然存款和储蓄函数中的参数,或用来创建变量。别的,顾客能够提到叁个XML类型的列和一个XML
Schema集来创制贰个新的类型化的XML列。集结中的XML
Schema被用来验证和类型化XML实例。

原文:Oracle
XQuery查询、创设和转换XML

归来数据库首页

 

项目化vs.非类型化的XML数据类型

XML数据类型与XML
schema集相关联,为XML实例扩展了Schema的强制性约束。尽管XML数据被波及到三个XML
Schema集结,它就被称为类型化的XML。不然,就称为非类型化的XML。

 

SQL Server 二〇〇五中XML数据类型达成了ISO
SQL-2002法规XML数据类型。它不光能够存款和储蓄结构能够的XML1.0文档,也能积累根节点为文本的所谓的XML内容段落,也能积存饱含自由数目根成分的剧情。针对富有优良格式数据的检查已经变成,那几个检查不必把XML数据类型绑定到XML
Schemas。这么些未有出色格式的数码无法被检查。

 

当Schema是不可见的时候,非类型化的XML就很有用。当Schema可见,但它的改变比非常的慢以致于很难维持的时候,恐怕当存在七个Schema,最终的绑定决议于外界的供给时,非类型化的XML也很有用。别的,当XML
Schema中包罗数据库引擎不援救的XML
Schema结构时,非类型化的XML也很有用。在那一个境况下,你能够利用在国有语言运营时(CL哈弗)客户自定义作用中的System.XML验证器来提供实用验证。

 

若果在XML Schemas集中,你有XML
Schemas来说述您的XML数据,你能够透过关联XML
Schema集和XML列用来提供类型化的XML数据。XML
Schema被用来证实数据的灵光;在编译查询只怕数额编辑语句期间实行比非类型化XML越来越准确的花色检查;也许被用来优化存款和储蓄和询问的处理作用。

 

类型化的列,参数和变量能够存款和储蓄XML文书档案(Document)或然内容段落(Content),在注解的时候,你能够经过按钮内定你存款和储蓄的连串(文档或然内容,默许的是内容)。其它,你不可能不相同期提供三个XML
Schema集。如若各类XML实例独有一个根成分,那么钦定为文书档案类型,否则钦点为剧情类型。在静态类型估量时期,XQuery编写翻译器使用文书档案(Document)标记消息来估测计算单个的根成分。

引用:

XML数据类型的办法

XML数据类型援救四种艺术来操作XML实例。XML数据类型的法门描述如下:

query()
方法辅导四个对若干个XML节点求值的XQuery表明式,允许客商查询三个XML文档中的段落。这一个办法的再次来到值一个非类型化XML文件类型的值。

 

value()
方法是用来从贰个XML文书档案数据值中提取关系型数值。那个办法带领多少个用来识别单个XML节点的XQuery表明式并赶回期待获得的SQL类型。XML节点的重返值被撤换为内定的SQL类型。

 

exist()方法允许客户在XML文书档案中推行查询以确认二个XQuery表达式的结果是或不是为空。当XQuery表明式再次回到四个非空的结果时,这一个方法的再次来到值为1;当表达式再次回到空时,方法重临值为0;当XML实例本身为NULL时,就回到NULL值。

 

行使XML数据类型的nodes()方法能够较轻便的把二个XML文书档案分解为关系型数据。nodes()方法接受多少个XQuery表明式,并重回二个行集(Rowset),行集中的每一行都陈诉三个由询问表达式所标记出来的上下文节点。XML数据类型的其余方法,如query(),
value(),exist(),和 nodes(),都能调用nodes()方法再次来到的上下文节点。

modify()方法能用来对贰个XML文书档案的剧情开展改动。它协助XML
DML语句,进而落成在三个XML实例中插入、更新恐怕去除二个或多个节点。当它碰着七个NULL值时,它会报错。

详尽内容,查阅“微软SQLserver二零零七 XML最好执行”白皮书。

XQuery入门

XQuery是一种用于XML查询的新语言,协助基于XPath2.0的数量浏览和征集。本章节为大家开首呈现了XQuery语言各市点的内容,举个例子XQuery和XPath之间的涉及,XQuery的独到之处,XQuery的应用领域,XQuery中XML
Schema的法规等等。

 

XPath2.0简介

XPath1.0,是由W3C职业组定义,用于在单个XML文档中牢固节点的言语。XPath1.0施用基于路线的平整来标志XML文书档案中的节点。同期它定义了XSLT
1.0和XPointer的着力法规。XPath
1.0有管理字符串、布尔值和浮点数的嵌入函数。它定义了依附设置的过滤标准来过滤节点的语法。XPath
1.0正值进级为XPath 2.0以帮助更加多的系列项目,提供更加多的效果与利益。XQuery
1.0基于对XPath
2.0,扩大了排序、重装、构造作用,况且落实了XPath2.0得不到完结的数目浏览和过滤方面包车型大巴品质。

 

XQuery简介

XQuery是三个方可定义、类型化、函数化的语言,是XML查询组专为从XML格式中查询数据而铺排的言语。XQuery具有与XML规范种类中XPath
2.0和XSLT 2.0一致的数据模型和XML
Schema类型系统。设计XQuery用于拍卖非类型化XML文书档案(不包蕴涉嫌数据的schema),类型化XML
schema,或许两个的混合体。就像上文提到的,XQuery
1.0好些个是X帕特h2.0的扩张集。XQuery
1.0除了具备X帕特h2.0的天性外,它还保有下边包车型客车属性:

•        在FLWOWrangler语句中加进了order by语句,它能够对文书档案数据开展双重排序。

•       
在FLWOPAJERO语句中加进了let语句,它亦可钦命表达式的结果以贯彻更加多的行使(SQL
Server 贰零零柒中不协助)。

•       
在查询语句的嵌缀部分,能够钦点静态的上下文节点(举个例子命名空间的绑定前缀namespace
prefix bindings)。

•        提供协会新节点的功用。

•        允许客商自定义函数(SQL Server 贰零零柒中不接济)。

•        能够成立modules/libraries(SQL Server 二零零六中不援救)。

XQuery的优点

•        当前的SQL和XPath知识是很容命理术数习的。

•        相比XSLT的询问语句,XQuery查询语句代码更简短。

•       
当XML数据是类型化的,那么XQuery是一个强类型语言,它亦可因此制止地下的类型调换以及确认品种是不是足以在询问操作中使用,来狠抓查询语句的奉行功能。

•        XQuery能当做弱类型语言应用,为非类型化数据提供越来越强的功效。SQL
Server 2005提供了还要帮助强类型和弱类型两种关系的静态类型。

•        因为XQuery实施查询必要的代码比XSLT少,所以它的实行效能也高。

•       
XQuery正在成为W3C专业组的推荐介绍语言,同一时间它也将会被主流的数据库提供商所援助。

在本文中,关于在编写制定XQuery1.0言语时索要特别注意的地点:

•        XQuery标准是基于当前费用条件实行阐释,以往或许会发生变化。而SQL
Server 二零零七是W3C工作草图所完毕的安定团结部分,不会爆发变化。

 

XQuery的应用领域

日常,XQuery的应用领域分类如下:

•       
查询和解析数据:XQuery在询问大容积数据时表现特出,並且能够过滤、分类、排序以及转变供给的音讯。标准的XML文书档案查询的运用满含描述半结构化音信,定义name-value包,剖判日志,管理日志以及监理应用的日志来研究潜在的应用错误和平安方面包车型大巴难点等等。

•       
XQuery的合併应用:当协会最早舍弃本身个人的融会应用措施,而起先采纳正式的以集成应用为底蕴的措施时候,知足把单个应用中内部定义使用的数量转换为标准的可以格式化转变的数码的须要就改成一流重要的难点。因为XQuery能够协会并转变XML数据,所以XQuery就满意了那么些供给。在合龙应用领域,八个规范的XQuery应用是把本地使用的XML数据库/关系型数据能源的词汇表,翻译为其它三个应用者的本土XML数据库/关系型格式数据语言。

 

在劳务器端使用XQuery的长处

对待起在客户端管理XML进程,在服务器端使用XQuery来拍卖XML进程要享有越多的优点。在那之中有个别独到之处能够总计如下:

•       
减弱网络负载:在劳务器端处理XML数据,只把结果传递到顾客端,降低了网络负载。

•       
尤其安全:独有当使用顾客端XML进程时才把客商端要求的数额传递到顾客端,幸免在网络上传输完整数据而带来的高危害。

•       
更易维护:在劳务器段管理XML能使得浏览器独立于顾客端代码,那能够更便于的维护客商端。

•       
品质的精雕细琢:在劳务器端使用XQuery写的查询语句可以应用SQL查询器举办优化。那样优化处理的性情要压倒在客商端重新获得多少并开展多少过滤。其它,还是能透过为XML数据类型的列创设索引来获得更加强劲的特性。

 

当使用XML Schemas时怎么实施XQuery

关系三个XML数据类型的XML schema集能被以下的涉及引擎使用:

•        在插入操作中来实例化XML。

•        在退换操作中来实例化XML。

•        在进行最先的静态类型错误检查和改正询问质量时,XML
schema中的类型音讯被用来鲜明最棒的查询计划和防止过多运维时的检错。

•        XML schema中陈说的类型新闻被SQL Server用来优化存款和储蓄。

引用:

XQuery表明式的布局

SQL Server
二零零七中的叁个XQuery表明式包括四个部分—前缀(prolog)和入眼(body)。前缀能每种注解饱含的命名空间。命名空间的宣示能够经过炫人眼目前缀和命名空间的U索罗德I,让你能够用前缀来代表查询体中的命名空间的U途观I。通过私下认可评释命名空间(declare
default
namespace)的宣示,你绝不绑定成分名称的默许命名空间就能够引用成分的称号。

 

XQuery表达式的主导包括了概念查询结果的查询表明式。比方,它能够是一个FLWO昂Cora表达式(参见本小说节的“FLWO哈弗语句”),多个XPath
2.0 表明式(参见本文章节的“XPath
2.0表明式”),大概别的三个XQuery表明式举个例子三个布局或算术表明式。

 

实例:在XQuery头中宣示暗中同意的命名空间

上面是从全体干部中检索三个JobCandidateID等于3的应聘者。查询中只定义了三个暗许命名空间,而从未运用其余一个命名空间前缀。

SELECT Resume.query(‘

        declare default
namespace  “”;

        /Resume/Employment

‘) as Result

FROM [HumanResources].[JobCandidate]

WHERE JobCandidateID = 3

 

实例:使用“WITH XMLNAMESPACES”语句注明命名空间

SQL Server同样帮衬SQL-二零零三的科班扩充,允许客商在SQL的每二个SQL查询要素上绑定XML命名空间,那样就足以制止双重表明同样的XML数据类型的法子。下边包车型客车询问显示了前面查询实例修改后的本子。这一个查询利用WITH
XMLNAMESPACES 语句注脚了一个命名空间。

WITH XMLNAMESPACES(

AS  “RES”)

SELECT Resume.query(‘

        /RES:Resume/RES:Employment

‘) as Result

FROM [HumanResources].[JobCandidate]

WHERE JobCandidateID = 3

 

XPath 2.0表达式

XQuery使用XPath2.0表明式查找贰个文书档案中的节点,在几个文档中移动节点依旧在文书档案间活动节点地方。定义移动路线的X帕特h是八个互相分离的步骤组成的不改变队列。每三个手续满含二个axis,三个node
test和多少个步骤推断。

 

Axis表明了运动的样子,和上下文节点的涉及。SQL
Server2005中援救的axes是child, descendant, parent, attribute, self
以及descendant-or-self。

 

三个node
test表明了手续采取的这个节点所必备满足的尺码。节点的标准化得以依赖节点名称可能节点类型来证实。

 

手续判定能够用动作(predicates)只怕再度援用(dereference)。贰个动作就充当二个在卓越框架下定义的三个节点队列中的节点过滤器;七个重复援引反映出八个节点队列中各节点的性质以及成分是还是不是与参照节点的平等。作为重新援用的输入,该节点队列必得带有IDREF也许IDREFS类型的成分也许性质。重新引用能够产生贰个新队列,其各节点ID类型的属性值都相配取自输入队列凉月素和质量的IDREF值。

 

XPath表达式的步骤是足以提到求值的。各种步骤施行时都为下一步设置了赋值的前后文项。Path表明式中的三个内外文项就是三个节点,它被采纳作为XPath表明式中各样步骤试行的再次回到值。依照前一步所猎取的上下文节点能够关联求妥善前的步子。XPath表明式推行完全体手续的回来结果就将是一个基于path表达式排列的文书档案中节点的雷打不动队列。

 

上面包车型大巴表明式用AdventureWorks数据库中的表[HumanResources].[JobCandidate]来譬如表明了path表明式的概念。上面的path表达式选用了address类型节点中值为Home的节点。

//child::ns:Addr.Type[.=”Home”]/parent::node()

Path表达式:

•        child 是axis的定义。

•        :: 是 axis 的分隔符。

•        ns 是命名空间前缀。

•        Addr.Type 是 node test。

•        [.=”Home”] 是多少个对准上下文节点的动词表明式。

XQuery同样补助缩写语法来证明axis。上面包车型地铁表格列举了axis以及对应的缩写语法。

表 2  axes缩写语法

图片 27

 

 

演示:从历史专门的职业中精选工作单位的名号

上边所示的XPath表明式选取了Emp.OrgName文本类型的,同期也是Resume/Employment子节点的节点。在此间,text()用来采用Emp.OrgName成分文本类型的子节点:

/Resume/Employment/Emp.OrgName/text()

引用:

FLWOR语句

FLWO帕杰罗语句组成了XQuery表明式的基点,它与SQL的SELECT语句很相似。FLWO福特Explorer(发音同“flower”)是FOGL450,
LET, WHERE, O冠道DER BY,
RETU途乐N的缩写。XQuery的FLWOMurano表明式能够举办再一次表明、变量绑定、过滤、排序以及重返结果的操作。SQL
Server 二〇〇六中援助FOEscort, WHERE, O福特ExplorerDELacrosse BY和 RETURAV4N:

For

FLWOQX56表明式中的for语句支持客户定义二个变量来遍历有些输入体系。该输入系列能够应用XPath表明式、原子值类别、分隔符系列或结构化函数。因而,这里的for语句与SQL
SELECT FROM语句看似,但与编制程序语言中的“for”语句区别。

 

绑定变量同样能够动用for语句注明。

 

演示:使用for语句从简历中寻觅全数的家庭地址

下边包车型大巴询问得出了JobCandidateID等于3的应聘者的address节点值等于Home的成分。

SELECT Resume.query(‘

        declare namespace
RES=””;

        for $A in /RES:Resume/RES:Address/RES:Addr.Type[.=”Home”]/..

        return 

        $A 

‘) as Result

FROM [HumanResources].[JobCandidate]

WHERE JobCandidateID = 3

Where 

FLWO景逸SUV表明式中选取Where语句能够筛选二个迭代的结果。

 

亲自过问:使用where语句选拔具备的家园地址

上面包车型地铁查询得出了JobCandidateID等于3的应聘者的address节点值等于Home的因素。

SELECT Resume.query(‘

        declare namespace
RES=””;

        for $A in /RES:Resume/RES:Address

        where $A/RES:Addr.Type[.=”Home”]

        return 

        $A 

‘) as Result

FROM [HumanResources].[JobCandidate]

WHERE JobCandidateID = 3

order by

Order by关键字能够对回到结果集进行排序。Order
by关键字能够应用三个排序表明式,那几个表达式必需再次来到贰个原子值。平时,你能够举行升序只怕降序排列。暗许的排序依次是升序。

 

示范:使用order by语句对查询出来的野史专门的职业举办升序排序

上面包车型大巴查询对JobCandidateID等于3的应聘者所从事过的专业根据其工时开展了升序排序。

SELECT Resume.query(‘

        declare namespace
RES=””;

        for $EMP in /RES:Resume/RES:Employment

        order by $EMP/RES:Emp.StartDate

        return 

        $EMP 

‘) as Result

FROM [HumanResources].[JobCandidate]

WHERE JobCandidateID = 3

return

Return语句,和SQL中的SELECT语句看似,能够钦赐询问的结果。你能够在return语句中应用别的三个灵光的XQuery表明式。你同一也得以由此在return局地中注解成分的构造、属性等来布局XML结构。

 

事必躬亲:使用return语句接纳历史专门的职业

上边的询问得出了JobCandidateID等于3的应聘者所从事过的具有职业的伊始日期,结束日期,专门的学问单位名称,职业职位。

SELECT Resume.query(‘

        declare namespace
RES=””;

        for $EMP in /RES:Resume/RES:Employment

        order by $EMP/RES:Emp.StartDate

        return

          <Employment>

                { $EMP/RES:Emp.StartDate }

                { $EMP/RES:Emp.EndDate }

                { $EMP/RES:Emp.OrgName }

                { $EMP/RES:Emp.JobTitle }

          </Employment>

‘) as Result

FROM [HumanResources].[JobCandidate]

WHERE JobCandidateID = 3

最近在SQL Server
2006中,XQuery还不帮忙let语句。那上面更加的多内容可参见本文章节“不帮助的特征和劳作中的实施方案”。

 

FLWOR表达式vs. XPath表达式

当安插展开的查询在for变量和for语句体之间含有三个JOIN操作时,系列能够用X帕特h表达式表明,但会形成试行功能低,那个时候理应利用FLWO奥迪Q3语句来定义该种类。只有当上面罗列条件中的二个依旧八个得到知足时,才符合接纳FLWOEscort表达式。

•       
若是想对三个当作某表明式重回结果的系列值举行迭代,你能够通过在for语句中绑定一个延续结果集值的变量来贯彻。实例都以由在for语句范围内同不正常间维持复制的新因素结合。

•       
当您要对for语句的结果连串进行过滤,而过滤是依照多个谓词且该谓词还不也许利用简便的XPath表达式举办求证时,使用where语句就可见达成对结果集的过滤。示举例下:

DECLARE @result xml

SET @result =
‘<Result />’

SELECT @Result.query(\’

for $i in (1, 2, 3), $j in (3, 4, 5)

where $i < $j

return sum($i + $j)

‘) as Result

•        假诺您想遵照五个简练表明式对结果集实行排序,那么能够利用order
by语句落成。

•       
当你要利用for语句的回到结果来定义重临结果集的类型时,使用return语句能够达成。

在颇具其余案例中,推荐应用XPath表明式。

 

XQuery的操作

作为一种功用性语言,在SQL
Server200第55中学协助XQuery的有余数据类型的函数和操作,可分类如下:

•        数学生运动算

•        比较运算

•        逻辑运算 

表 3 SQL Server贰零零陆补助的运算符

图片 28

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图