转发–SQL Server 二〇〇五的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

注:帮忙索引的命名无法与主索引同样。

概念贰个XML变量

利用 XQuery,能够依照 XML 数据以及能够用 XML 表示的非 XML 数据生成 XML
文书档案,无论其职责怎么:无论是存款和储蓄在数据库中、置于网站上、即时成立也许存款和储蓄在文件系统中。但要注意,Oracle
XML DB 为针对数据库中存款和储蓄的数据开展的 XML
操作提供了要命高的性质和可伸缩性。因而,借让你能够完全调整所处理的数码,则最棒将它移动到数据库中。

        declare namespace
RES=””;

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

注:删除主索引,与其有关的装有支持索引也会被去除。因而地点语句中去除学生消息表索引后,扶助学生新闻表索引也被删除了。

SQL
Server对于XML援助的主干在于XML数据的格式,这种数据类型能够将XML的多寡存款和储蓄于数据库的指标中,比方variables,
columns, and
parameters。当您用XML数据类型配置这么些指标中的叁个时,你钦点项指标名字仿佛您在SQLServer
中钦定二个品种同样。

在事实上意况中,以上的 XML
文件只怕置于网站上(由此能够由此互连网获取)、以文件方式积累在地面文件系统中,或以文件财富格局积攒在
Oracle XML DB
音讯库中。就本示例来讲,该公文位于网址上。为简易起见,能够在目录(Web
服务器在中间蕴藏可从 Web
看到的文书档案)中创立一个职工文件夹,然后在该文件夹中插入 empsbonus.xml
文件,以便能够经过以下 U帕杰罗L 访谈 empsbonus.xml 文件:

‘) as Result

FOR XML RAW

将表转变到元素名称是row,属性名字为列名恐怕列的别名。
示例9:将Student表调换为XML格式(FOGL450 XML RAW)
Student表的数量如图所示
图片 1
实行语句:

SELECT * FROM Student FOR XML RAW;

询问结果如图所示
图片 2
图片 3

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: 使用数字索引来引用成分下的结果

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



























cast as xs:TYPE ?操作符

XML索引

是因为XML数据类型最大可存款和储蓄2GB的数量,由此需求创立XML索引来优化查询质量。

接下去我们看看怎么样定义一个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的数码。

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

                <City>Redmond</City>

FOR XML子句

因此在SELECT语句中运用FO奥迪Q7XML子句能够把数据库表中的数据检索出来并生成XML格式。SQL Server
二〇〇九支撑FOQX56XML的三种格局,分别是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
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('...

引用:

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

能够制造xml类型的变量,参数和列,只怕将XML架构集结和xml类型的变量、参数或列关联,这种气象下,xml数据类型实例称之为类型化xml实例。否则XML实例称为非类型化的实例。

  • 二个实例的XML列不能包罗超越2GB的数目。
  • 三个XML的列不可能是索引。
  • XML对象不可能动用Group By的子句中。
  • XML的数据类型不援助相比和排序。

将列表 4 中的 orderTotal XSLT 样式表与查询 XMLType
数据部分中的示例使用的 XQuery 表明式实行相比,您或者会注意到,XQuery
方法要比 XSLT 方法更具吸重力。至少在应用 XQuery
时,您只需编写非常少的代码就能够获得同样的尾声结出。

XQuery同样补助缩写语法来注解axis。上边包车型地铁报表列举了axis以及对应的缩写语法。

从没名称的列

上边介绍一种轻松的FOCRUISER XML PATH应用措施

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

查询结果如图所示
图片 4

注:要是提供了空字符串FOWrangler XML PATH(‘’)则不会转换任何因素。

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

查询结果如图所示
图片 5
示例12:利用xmlTest表和mainTeacher表查询出xmlTest表中成绩>=700分的学生的班首席营业官消息和学生音信,并转化成XML格式
XmlTest表数据如下图所示
图片 6
MainTeacher表数据如下图所示
图片 7
试行上面的讲话

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>

 


100
Steven King
1200


101
Neena Kochhar
1000

                <Temp Date=”2004-11-06″ High=”55″ Low=”43″ />

TYPE命令

SQL Server协理TYPE命令将FO凯雷德 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表

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

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

 

该 XQuery 应生成二个 XML 文书档案,个中包含 Oracle 本事网 (OTN) 近期揭露的与
PHP 本事相关的头条消息列表。所生成的 XML 文书档案或然如下所示:

日常相比较运算符能够举办原子值、体系或许两方的可比。普通相比运算符是=、
!=、<、>、<=和>=。普通相比较必需是能够量化的,意思就是说任何比较的结果都是现实存在的。

辅助XML索引

为了提升主XML索引的性质,能够创制帮忙XML索引。唯有成立了主XML索引后技巧创立帮忙XML索引。帮忙XML索引分3种:PATH,VALUES和PROPERTY帮忙XML索引。

XML的数据类型确定保证了您的XML数据被完全的营造保存,同时也合乎ISO的标准。在概念三个XML数据类型此前,大家先是要通晓它的二种范围,如下:

此时,/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 // 构造:

一个node
test表达了手续采纳的这么些节点所必备满足的标准化。节点的规格得以依据节点名称也许节点类型来注解。

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数据类型的应用限制
只有ST汉兰达ING数据类型技巧调换到XML。
XML列无法利用于GROUP BY语句中
XML数据类型存款和储蓄的多少不可能超出2GB
XML数据类型字段无法被设置成主键可能外键或称为其一部分。
Sql_variant数据类型字段的行使不可能把XML数据类型作为种子品种。
XML列不可能钦定为独一的。
COLLATE子句不可能被选取在XML列上。
仓储在数据库中的XML仅帮助128级的档次。
表中最对只可以具备叁10个XML列。
XML列不能参预到准则中。
独一可选取于XML列的放权标量函数是ISNULL和COALESCE。
抱有XML数据类型列的表无法有三个超越15列的主键。

这几个事例通过行使DECLARE  评释去定义名字为@ClientList
的变量,当自家证明变量的时候,只供给包罗XML的数据类型的名字在变量名后。

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;

                <MiddleName></MiddleName>      

FOR XML EXPLICIT

允许客商显式地定义XML树的形状,不受AUTO方式中的种种限制。不可能将FO安德拉 XML
EXPLICIT直接用在SELECT子句中。
示例11:将xmlTest表调换为XML格式(FO凯雷德 XML EXPLICIT)
XmlTest表的数量如图所示
图片 9

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,不能漏掉,否则结果会以表格形式显示

查询结果如图所示
图片 10
图片 11
在结果图中我们开采,红框中3个班级消息列在一块,而全数学生都列在高级中学一年级3班下,那不是大家想要的结果,大家希望种种班级对应本人的学习者。那么什么样解决此类难题吗,那关乎到排序。

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

率先删除代码行末的FORAV4 XML
EXPLICIT语句,仅仅试行剩下的有的,使结果以表格方式表现,那么结果如下
图片 12
其一表格每行的次第也意味着了该表格转化为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;

比较第一回代码,大家发掘上边的代码不独有在行末对数码按成分属性实行了排序,还在赋值的代码中兼有更动。在层级1代码中全然未有退换,因为层级1的代码效能是安吹捧ML格式的,对数据排序未有影响。在底下多少个层级的赋值部分,每一种层级的代码中都对下面多少个层级的要素重复赋值,那样做使结果的表格中不再有那么多属性值是NULL,能够方便排序。最终再依据成分[班级音讯!2!班级]和[学生新闻!3!学号!Element]排序。让大家看看结果怎么着。
运维方面包车型大巴代码,但不运转FOLX570 XML
EXPLICIT语句,看看表格中数据内容和行顺序是还是不是变动
图片 13
如图所示,开采用实行数据和学生数量的顺序展现准确。运营具备代码获得XML文书档案,结果如图所示
图片 14
出于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表,看看种种班级和它下属学生的层级关系是或不是有误。

注:写FOLX570 XML
EXPLICIT代码要细心,层级1的代码中先安装层级结构,不要先急着赋值。在部属层级的代码中对层级第11中学的代码举行赋值,最棒重复赋值,不然就能产出文中的排序难点。如若某些层级出现重复数据,在该层级的代码前加DISTINCT关键字。解决排序难题最棒的法门是对一一层级的性子重复赋值并在最终用OPAJERODER
BY按层级属性排序。

留意察看地点的XML文书档案,发掘总分属性的值是个float类型,要把它转变来int,只需求把层级3中对总分的赋值代码改成CAST(年级总分
AS int)
图片 15

注意:

因为XQuery是一种特别复杂的言语,大家只是提到了一有个别她的组件,如若想要更进一竿的知情它什么运用,请查看MSDN XQuery
language
reference.

那我们以后先来通过例子来看一下query()和value
多个艺术是哪些行使XML数据的。需求小心的是自己接下去的测量检验意况是SQLServer二〇〇九Haval2。实例中蕴涵了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: 创制测量检验境况和数量

正如你在此以前边的局地中通晓到的,XQuery 是一种用于查询 Oracle 数据仓库储存款和储蓄的
XML 内容的敏捷方法 – 无论你是拍卖地点存款和储蓄的 XMLType
数据大概查询基于关周密据营造的 XML
视图。但传闻对数据接纳的仓库储存类型的不比,XQuery
表明式的实行品质恐怕差距不小分裂。越发是,Oracle XML DB 能够优化基于由
ora:view 函数创立的 SQL/XML 视图而创设的 XQuery 表明式。对于 XMLType
表或列中蕴藏的 XML 数据,只好对应用结构化(对象-关系)存款和储蓄本领存款和储蓄的遵照XML 形式的 XMLType 数据开展 XQuery 优化。

        SET NOCOUNT ON;

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>的子元素

查询结果如图所示
图片 16
点击查询结果
图片 17
如想查询标签

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

结果如图所示
图片 18

注: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

询问结果如图所示
图片 19

注:SQLType不可能是XML数据类型,公共语言运维时(CLPAJERO)客户定义类型,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 '插入节点后信息'

询问结果插入节点后音信如图所示
图片 20

注: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

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

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>
下,当然也得以来自不一样。

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

EABEL-20021009123338324PDT
1328.05


EABEL-20021009123335791PDT
2067.15


EABEL-20021009123336251PDT
289.6


EABEL-20021009123336382PDT
928.92

          element Education

FOR XML PATH

PATH格局提供了一种较轻巧的办法来混合成分及品质。在PATH方式中,列名或列别称被用作XPATH表明式来管理,这几个表达式钦命了怎么着将值映射到XML中。默许情状下,PATH格局为每同样自动生成

总结

 

大家大致领会了XML在SQLServer
中的轻易利用,从概念到使用方法。也见到了query()检索子集,也能应用value()检索独立的成分属性的值。当然除外还应该有向exist(``)
andnodes()
那样方法,同盟语法都以应用,那有的就不再举行讲了,大同小异。有不掌握的能够私聊。越多采纳方法还请访谈MSDN来赢得(寻觅XQuery
language reference)。

原文:Oracle
XQuery查询、营造和转变XML

回去数据库首页

AND
PatientRecord.exist(‘/PatientRecord/ProblemDetails/Symptoms/Symptom/text()[contains(.,”Abdominal
Pain”)]’) = 1

FOR XML AUTO

采用表名称作为元素名称,使用列名称作为品质名称,SELECT关键字前面列的次第用于XML文书档案的层系。
示例10:将Student表调换为XML格式(FO宝马X5 XML AUTO)
实践语句:

SELECT * FROM Student FOR XML AUTO;

询问结果如图所示
图片 22
图片 23

<!-- 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>

但在好几景况下,很难开掘 XQuery
表明式的哪些构造将使少数查询的品质更加好。这即是为什么最棒在开辟阶段使用调度工具的来头。

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

XML查询技能

XML文书档案以三个纯文本的款式存在,首要用于数据存款和储蓄。不但有助于顾客读取和动用,何况使修改和维护变得更便于。

自己设定了变量的值,然后使用select
来研究那个值。和大家想的一律,它回到了XML的文书档案。如下:

在上述 XQuery 中,fn:doc XQuery 函数用于访谈 Oracle XML DB
新闻库中储存的单个 XML 文书档案。但一旦要管理局地具备同等或一般结构的 XML
文档(存款和储蓄在同一 XML
音讯库文件夹中),应该怎么办?这种情形下,另一个用来拍卖 XML
新闻库能源的 XQuery 函数(即
fn:collection)可能会派上用场。本文稍后将介绍多少个关于怎样采用fn:collection XQuery 函数的演示。

        element MedicalInfo { /PatientRecord/ProblemDetails }

XQuery简介

XQuery是一种查询语言,能够查询结构化只怕半结构化的多少。SQL Server
二零一零中对XML数据类型提供了支撑,能够存款和储蓄XML文书档案,然后选取XQuery语言举办查询。

100
SKING
AD_PRES

        return

主XML索引

主XML索引对XML列中XML实例内的持有标志,值和路线进行索引。创造主XML索引时,相应XML列所在的表必需对该表的主键创设了聚焦索引。

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;
/

 

FOSportage 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</联系电话>

总结

 

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’使用X帕特h形式提供了三个路线,代表要回到XML文书档案中该路径下的多少行,2是叁个可选数据参数,表示将那么些数量行以成分为基本映射。

XQuery 与 XSLT

体系车检查查表明式

接下去,固然您须求基于 empsbonus.xml
文档中蕴藏的数量创设一个表格。在该报表中,您恐怕不止要含有列表中显得的奖金数目以及各样职工的职工
ID,还要富含他/她的人名。由此,能够率先选择以下查询生成二个新的 XML
文书档案(若是你以 H讴歌RDX/HEvoque 的地方连接):

          element Education

该查询将转换以下输出:

        for $ED in /RES:Resume/RES:Education

列表 2:基于关周到据构建 XML 并将其保存到 XML 音讯库

                <Temp Date=”2004-11-05″ High=”52″ Low=”36″ />

要博得同样的最终结果,能够改用 XMLQuery 函数。但假若将上一个演示中央银行使的
XQuery 表明式参数字传送递给 XMLQuery(如下所示):

插入操作

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

 

列表 1:使用 ora:view 基于关周密据成立 XML

•        不帮衬不相同门类种类的串联,如节点和数目。

102
De Haan
17000


7839
KING
5000


100
King
24000


101
Kochhar
17000

                { $EMP/RES:Emp.JobTitle }

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;
/

 

查询外界数据源

SET @EducationLevel = ‘Bachelor’

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

                        <EndDate>10/04/2004</EndDate>

//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;
?>

FROM [HumanResources].[JobCandidate]

鉴于 LacrosseSS 音讯提供精神上是三个托管的 XML 文件(GranTurismoSS
音讯阅读器从中获得头条音信或任何剧情),由此得以像管理其余别的能够通过
Web 得到的 XML
文书档案那样来管理它。正如您在本文后面包车型地铁查询外界数据源部分中所见,能够利用
XQuery 查询任何能够因而 U福睿斯L 访谈的 XML。您通过 XMLTable 和 XMLQuery SQL
函数中的 PASSING 子句动态绑定全体外界 XML 数据源。以下是三个询问 EvoqueSS
音信提供的 XQuery 示例:

当修改四个非类型化XML文书档案时,新节点值的表明式必得再次来到独一的贰个类型化节点。对于一个类型化XML文档来讲,新节点值的表明式的品类必需是原表达式的品类或许子类型。

则 XQuery 表明式再次来到的空连串将与 purchaseorder
表联接,从而富含在查询总计果集中。实际上,那意味着输出将不只有包罗为顾客EABEL 伏乞的订单生成的 OrderTotal 成分,何况还包罗为 purchaseorder
表中存放的保有其余订单生成的空行(暗许情状下,purchaseorder 表包罗 132
行)。从结果集中拔除空行的办法之一是在 SELECT 语句的 WHERE 子句中运用
existsNode SQL 函数,并不是在 XQuery 表达式中运用 WHERE 子句,如下所示:

        element CustomerInfo

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;

        <Address>Element count is { count(/RES:Resume/RES:Address)
}</Address>

依附关周详据营造 XML

上面是从全体干部中搜索四个JobCandidateID等于3的应聘者。查询中只定义了二个暗中认可命名空间,而并没有动用另外贰个命名空间前缀。

但在付出实际应用程序时,您将十分的大概须要 XQuery 表达式直接生成 HTML
标志,并非仅仅转移二个如上所示的 XML
文书档案。那样,您便得以创设七个越来越灵活、可维护性更加高的应用程序,原因是在这种状态下,全体冠道SS 管理(从提取须要的数额到将它包裹在 HTML
标志中)都将改造成数据库。那使您不要编写担任 RAV4SS
管理的应用程序代码。实际上那意味你不用在比方 奇骏SS
音信提供的布局早就改成的情形下修改应用程序代码。相反,您只需修改用于 LANDSS
管理的 XQuery 表达式。

          {

设若应用程序管理关全面据而非 XML,而你供给拜望的数码以 XML
格式存款和储蓄,则将 XML
分解为关周密据大概会分外实用。继续张开上有的的亲自过问,您能够接纳 SQL
函数 XMLTable 将职员和工人 XML 成分分解为虚构表的单个列,如下所示:

示例:使用contains()函数

在 Oracle 数据库 10g 第 2 版中,Oracle
引进了三个与该数据库集成的专职能自带 XQuery
引擎,该引擎可用来完毕与付出援救 XML 的应用程序相关的各个任务。XQuery
是一种用于拍卖 XML 数据模型的询问语言,它实在可操作任何项目标可用 XML
表达的多少。就算 Oracle XQuery
推行令你能够应用数据库数据和外部数据源,但在管理数据库中存款和储蓄的结构化数据方面,Oracle
XML DB 日常能够无庸赘述增加品质。

示例:使用count()函数

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

WHERE JobCandidateID = 2

在以上示例中,您在 XMLTable 函数的 PASSING 子句中利用 OBJECT_VALUE
虚构列将 purchaseorder 表作为左右文项传递给此间使用的 XQuery
表明式。XQuery 表明式总计客户 EABEL
乞求的各种购买订单的合计,并为管理的各种订单生成二个 OrderTotal XML
成分。要访谈生成的 XML,请使用 SELECT 列表中的 COLUMN_VALUE
设想列。最后的输出应如下所示:

                        <AvgHigh>{
sum(/WeatherInfo/Boston/Temp/@High) div
count(/WeatherInfo/Boston/Temp/@High) }</AvgHigh>

列表 3:使用绑定变量

                element Name { sql:column(“Store.Name”) },

你可以见见,以上突显的查询生成同样的末段结出,但它们的举行安顿并差异。查看最终贰个示范中的
XQuery 表达式,您或然会专一到它迭代顶层 PurchaseOrder 成分,其中的各类PurchaseOrder 成分都代表依照 PurchaseOrder XMLType
形式的表中的一行。这表示实际上海重型机器厂写 XQuery
表达式,以迭带基础对象表(用于存款和储蓄分解的 PurchaseOrder
文书档案)中的行。与查询要迭代不表示基础表中的单个行的 XML
元素比较,该措施的品质更加好有的。

                element GPA { string($ED/RES:Edu.GPA)},

那将转移以下输出:

        ‘)

以上查询将拍卖顾客 EABEL 必要的持有订单(即存款和储蓄在 XMLType 的暗中同意PurchaseOrder 表中的订单)并将转移与查询 XMLType 数据部分中的 XQuery
查询同一的出口。

‘) as Result

100
1200


101
1000

          }


100
King
24000


101
Kochhar
17000


102
De Haan
17000

SELECT Resume.query(‘

以上查询与本有的开端的 XMLTable 示例生成同样的输出。

                  substring(string($EMP/RES:Emp.EndDate),1,10), “, “,

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;

                <Temp Date=”2004-11-01″ High=”53″ Low=”45″ />

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扶助两体系型的数额访谈函数:string()提取节点中的字符串值;data()提取类型化节点值。固然节点不是文件节点,不是性质节点,也不是因孟秋点,那么data()函数抛出叁个景观错误。若是节点是三个非类型化XML实例的文书档案节点,那么data()再次来到文书档案的字符串值。假若节点是贰个复合类型成分,data()重返叁个情形错误。

为访谈 Oracle XML DB 消息库中蕴藏的 XML 数据,Oracle XQuery 引进了
fn:doc 和 fn:collection XQuery 函数。使用 fn:doc,您能够查询 XML
音讯库中寄存的单个 XML 文书档案,而 fn:collection
令你能够访谈同一音讯库文件夹中蕴藏的三个 XML 文书档案。

        [PatientID] [int] IDENTITY(1,1) NOT NULL,

正如本文以前(参阅使用关全面据创设 XML部分)介绍的身体力行所示范,使用
fn:doc 特别轻便直接。它拿走表示消息库文件财富 (U奥迪Q5I) 的字符串并重临该 UENCOREI
指向的文档。要打听 fn:collection XQuery
函数的效果与利益,同一文件夹中最少应该七个音信库文件。若是已经运转了列表 第11中学的代码,则已经创办了 /public/employees 音信库文件夹并在中间蕴藏了
employees.xml 文件。由此,您将急需在该文件夹中足足再制造一个 XML
文件,然后本领试用 fn:collection。列表 2 中的 PL/SQL 代码基于
SCOTT/TIGECayman 演示数据库形式的 dept 和 emp 表存储的关周到据创设XML,然后将转移的 XML 文书档案作为 acc_dept.xml 保存到 /public/employees
新闻库文件夹。要运维列表 2 中的 PL/SQL 进度,请确定保证以 SCOTT/TIGE索罗德的身份登入。

        declare namespace
RES=””;

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

SQL Server 二零零五协理多个数学运算符,分别是+、b、*、div和
mod。方今,还不扶助idiv。

询问 奇骏SS 消息提供

上面包车型客车表和XML文书档案举例表明了XML DML的操作:

缓慢解决质量难题

SELECT Resume.query(‘

(小编:铭铭)

下边包车型客车询问重返了富有获得商业职业博士学位的应聘者的简历:

在本文后边的询问 XMLType 数据部分中,您收看了三个关于使用 XQuery 将贰个XML 文书档案调换为另三个 XML 文档的身体力行。具体来说,该示例使用 XQuery
表明式总结示例数据库情势 OE 的 purchaseorder
表中存款和储蓄的订单的订单一共,然后为管理的各样订单生成了叁个 OrderTotal XML
成分。实际上,您可以应用 XSLT
试行同一操作。为此,您首先需求创立一个用到于 PurchaseOrder XML 文书档案的
XSLT 样式表,以退换对应的 OrderTotal 元素。对于此示例,能够运用列表 4
中所示的 XSLT 样式表。

使用XQuery构造XML

为方便起见,您恐怕需求将此 XSL
样式表保存在数据库中,然后再早先利用它。例如,您能够将样式表作为文件财富保存在
Oracle XML DB
音讯库中。执行该操作的不二等秘书籍之一是将样式表作为文件保留到地头文件系统中,然后使用以下有个别互联网球组织议将它移动到
XML 消息库:FTP、HTTP 或 WebDAV。假若你曾经将列表 4 中的 XSLT 样式表作为
orderTotal.xsl 保存在 /public
音讯库文件夹中,未来得以按以下示例所示将它用作 XMLTransform SQL
函数的参数(如果你以 OE/OE 的身价登入):

WHERE JobCandidateID = 2

纵然 Oracle 在 Oracle XML DB 中提供了一个自带 XSLT
管理器,但在无数情况下(尤其是在拍卖大型文书档案时),XQuery 对于营造 XML
越来越高速。另外,XQuery 表明式日常比为同一作业设计的 XSLT
样式表更具可读性,况兼更精晓。与 XSLT 同样,XQuery 不但可用于将三个 XML
文书档案调换为另三个 XML 文书档案,而且还可用来将 XML
转换为另一种基于文本的格式,如 HTML 或 WML。

        declare namespace
ST=””;

您能够见到,以上输出包蕴从 employees.xml 和 acc_dept.xml 中收获的员工XML 成分,那一个因素表示薪水大于或等于 5,000 美金的职员和工人。

SELECT Resume.query(‘

在列表 1 中的第四个 PL/SQL 进度中,您只是在 XML
音讯库中开创了二个新文件夹。在该消息库文件夹中,您随后将积存此处突显的第3个PL/SQL 进程中开创的 XML 文书档案。第二个 PL/SQL 进度首头阵出 SELECT
语句,该语句使用 XMLQuery SQL 函数基于关周详据创设 XML。对于 XQuery
表明式(XMLQuery 在此地将其当作参数)来说,请留意嵌套的 FLWOQashqai表明式中利用的 ora:view XQuery 函数。在该示例中,ora:view
获取七个输入参数,即“H冠道”和“employees”,它们提醒该函数查询属于 HCR-V数据库方式的职员和工人表。由此,ora:view 将回来贰个象征 H奇骏.employees
表行的职工 XML
文书档案系列。但为了省去结果文书档案中的空间,只将前多个职员和工人记录传递给结果种类。那是通过在
FLWOPRADO 表明式的 where 子句中钦定 $i/EMPLOYEE_ID <= 102
而落到实处的。请留心 FLWORubicon 表明式的 return 子句中选拔的 xs:string()
xs:integer() XQuery 类型表明式。实际上,此处使用的那多个 XQuery
表达式不仅仅将 XML
节点值调换为相应的品种,并且还将提取那一个节点值。随后,生成的职员和工人 XML
文书档案作为 employees.xml 保存到事先在列表 1 中另三个 PL/SQL 进度中创立的
/public/employees XML 音信库文件夹。要确认保障此操作已产生,可实行以下查询:

摘要

该查询应生成以下输出:

 

列表 3 中彰显的脚本应生成以下输出(注意,浏览器中或许不会议及展览示标志):

                element StartDate { string($ED/RES:Edu.StartDate)},

查询 XMLType 数据

示例:使用data()函数

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;

return

XQuery 令你能够操作基于 XML
方式以及非基于形式的数码。以下示例演示了什么使用 XMLTable 函数从 OE
演示数据库格局中询问基于 PurchaseOrder XML 形式的 XMLType 表。

   Expression1 

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('...

        /RES:Resume/RES:Education[RES:Edu.Level=”Bachelor” and
RES:Edu.Major=”Business”]

你只怕对为上述查询生成的实施陈设并不称心。特别是,所拍卖的行数恐怕非常的大。由于
SQL
调度的要紧对象是幸免访问对结果没有其余影响的行,因而或许要三番五次调解查询以优化质量。对查询中包罗的
X帕特h 表明式进行重新建构模型后,能够重新重试它,如下所示:

                <Temp Date=”2004-11-02″ High=”56″ Low=”42″ />

正如您从前方的身先士卒中询问到的,在 Oracle XQuery 实践中,doc 和 collection
XQuery 函数用于访谈 Oracle XML DB 消息库中蕴藏的 XML 文书档案。能够通过
XMLTable 和 XMLQuery SQL 函数中的 PASSING
子句动态绑定外界数据源。思索以下示例。假诺你的同盟社要为那三个从事于 XQ
项目标职员和工人支付奖金。由此,财务部发布了 empsbonus.xml
文件,当中富含有资格猎取奖金的职员和工人列表以及该列表中输入的各样职工的奖金数量。empsbonus.xml
文件大概如下所示:

                element GPAScale { xs:decimal($ED/RES:Edu.GPAScale) }

该组织应生成以下输出:

 

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
数据的迅猛方法。即使 Oracle XQuery 执行让你能够操作任何可以用 XML
表示的数目(无论它存款和储蓄在数据库中、位于网址上恐怕存款和储蓄在文件系统中),但将管理的数额移动到数据库中平昔是二个不易的呼声。对于数据库中蕴藏的多寡,Oracle
XML DB(对 XPath
重写使用一样机制)只好眼看优化管理那个基于以下数据塑造的 XQuery
表达式:这几个数据包罗关周到据、对象-关周全据或使用结构化(对象-关系)存款和储蓄才干存款和储蓄的依附XML 方式的 XMLType 数据。

前段时间,让大家倘使信息本领部门安排选择预装了微软Windows® XP 和微软 Office
2000软件的微管理器种类。上边包车型大巴查询接纳了预装了Windows XP 和 Office
三千的硬件设备列表。

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

WHERE JobCandidateID = 3

以上查询是三个有关如何选用 XQuery 基于 XML 和非 XML
数据(以分裂的章程从不一致的多少源中检索)生成 XML
文书档案的示范。具体而言,使用 ora:view() 函数访谈 HR 演示情势中的暗许
employees 关系表,并使用 PASSING 子句中的 httpuritype() 函数借助于
HTTP 访问 empsbonus.xml 文书档案。然后,在 FLWOR 表明式的 return
子句中创设新的 XML 文书档案。最终,将获得以下 XML 文书档案:

 

http://localhost/employees/empsbonus.xml

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

另一种可以综上说述提升 XQuery
表达式实行品质的技巧是使用绑定动态变量。使用绑定变量(并不是将变量串联为字符串)能够使
Oracle 重用 SQL 语句,进而降低深入分析开销并明显升高应用程序的属性。能够在
XMLQuery 和 XMLTable SQL 函数中选择 PASSING 子句将动态变量绑定到 XQuery
表达式。该本领令你能够遵照顾客端代码中总括的参数动态生成 XML。列表 3
中的示例演示了怎么着在从 PHP 脚本实施的 XQuery 查询中利用绑定变量。

SELECT Resume.query(‘

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;

SET @result =
‘<Result />’

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

某工作单位的音信本领机构索要付出二个行使来保管硬件器具和软件程序资产。那个利用必须追踪的硬件的新闻富含设备编号,顾客新闻,管理器/内部存款和储蓄器/BIOS/主板/声卡等系统消息,系统自带的软件,购销音讯和版本音讯;应用必得维护的商家的软件消息富含软件项目,买入的授权号等等。应用还少不了扩大帮助将来只怕现身的新资金财产连串。资金财产管理类别还能用来生成报表,如硬件应用情状,软件授权号选拔处境和硬件配备的维护开销。在那一个地方中,需用在三个表中的同列中保留由不一致schema说明的新闻。多个schema的非类型化XML能够用来保存新闻。三个schema
collection的类型化XML也足以保存消息。存款和储蓄成XML数据类型的资金财产新闻可以使用XQuery来查询。

所接纳的囤积模型并非是影响 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 的身份登陆并运维以下查询:

          }

本文提供的示范不只有示范了在怎么场面下以及哪些行使 XQuery 查询、营造和改造XML,並且还身体力行了何等监控和深入分析 XQuery
表明式的性质推行,从而找到更敏捷的办法来拍卖同一专业负荷。

•       
尤其安全:只有当使用顾客端XML进度时才把顾客端供给的数额传递到顾客端,防止在网络上传输完整数据而带来的危机。

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

                <Temp Date=”2004-11-06″ High=”54″ Low=”41″ />

在急需的情事下(举例,向 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 基于示例数据库形式 H福睿斯的私下认可职员和工人涉嫌表中积累的数目营造 XML 文档。

类型转变函数

将 XML 分解为关周密据

    <Gender>Male</Gender>

上边包车型地铁询问利用position()函数获得某应聘者的最终一个address节点。

        declare namespace
RES=””;

          <Employment>

表:

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

品类检查表达式

《XML在微软SQL Server 二〇〇五中的最好实行》(XML Best Practices for
Microsoft SQL Server 二〇〇六)

        return

                element YearOpened {
string((/ST:StoreSurvey/ST:YearOpened)[1]) },

•        substring() 提取输入字符串在别的八个字符串中的地方。

•       
Range表达式(to操作符):Range说明式能够选择to操作符来构架自增的整数系列。譬如,叁个range表明式(6to10),它能够构架队列(6,
7, 8, 9, 10)。应用方案—你能够列骑行列的兼具值,以取代使用to操作符。

,

FROM [HumanResources].[JobCandidate]

FROM [HumanResources].[JobCandidate]

•        其余特征:上面包车型地铁特点也不提供支撑:

        declare namespace
RES=””;

语法:

SQL Server 2006中的XML数据类型

‘) as Result

        $A 

 

                element Level { data($ED/RES:Edu.Level) },

场景1:质量评价系统

        declare namespace
RES=””;

        <Boston>

        for $ED in /RES:Resume/RES:Education

          {

                concat( substring(string($EMP/RES:Emp.StartDate),1,10),”
to “,

 

引用:

以此白皮书仅用于提供音讯之指标。微软公司对那几个文件的音讯不做别的保管、明示、暗意或许法律相关任务。

  </PatientDetails>

引用:

一般相比运算符

‘) as Result

                        {{{as first | as last} into} | after | before}

 

SELECT @Weather.query(\’

SELECT Resume.query(‘

 

        return 

                        <AvgHigh>{
sum(/WeatherInfo/NewYork/Temp/@High) div
count(/WeatherInfo/NewYork/Temp/@High) }</AvgHigh>

SELECT Resume.query(‘

‘) as Result

                element AnnualRevenue {
string((/ST:StoreSurvey/ST:AnnualRevenue)[1]) }

        return

 

逻辑操作符

SELECT Resume.query(‘

/* Stored procedure to insert a new skill element for a candidate */

引用:

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

                        <StartDate>20/02/2000</StartDate>

        </Education>    

数值比较运算符

                <Country>US</Country>      

实例:在XQuery头中声称暗中认可的命名空间

          element Skill { data($Skill) }

含有在本文中的内容,代表了微软公司在那几个题目上风行的思想,直到正式发布软件甘休。因为微软必需依赖市镇条件的生成做出响应,因而本文不应作为微软其余单位的允诺,何况微软不能够担保在正儿八经版本发表后,本文中别的音信的正确性。

上面包车型客车表和XML文书档案比方表达了在病例场景中XQuery的施用。

          </Employment>

                <Temp Date=”2004-11-01″ High=”53″ Low=”45″ />

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

WHERE JobCandidateID = 3

示例:使用“xs:TYPE()”操作符

 

SELECT Resume.query(‘

        <NewYork>

END

XML数据的更换

 

XQuery的应用领域

        </Boston>

                </Employer>

   Expression2

XPath表达式的步调是能够提到求值的。各个步骤奉行时都为下一步设置了赋值的上下文项。Path表明式中的二个左右文项正是贰个节点,它被增选作为XPath表明式中每一种步骤推行的再次来到值。依照前一步所收获的上下文节点能够关联求妥善前的手续。XPath表明式实施完全体手续的回到结果就将是贰个根据path表明式排列的文书档案中节点的有序队列。

FROM [HumanResources].[JobCandidate]

隐式类型转变

图片 26

                element Level { xs:string($ED/RES:Edu.Level) },

                element EndDate { string($ED/RES:Edu.EndDate)},

只有另作表明,否则文中描述的市肆、组织、产品、域名、电子邮件地址、Logo、职员、地方和事件都以编造的,无意联系或暗指与别的实际的小卖部、协会、产品、域名、电子邮件地址、图标、人士、地方和事件负有关联。  

绑定变量同样能够行使for语句注解。

SET @result =
‘<Result />’

        }

                element NumberOfEmployees {
string((/ST:StoreSurvey/ST:NumberEmployees)[1]) },

 

XQuery简介

 

•        错误函数(error function): fn:error().

             RevenueInYen = “{ $S/ST:AnnualRevenue*106.8100  }”

不支持的特征和劳作中的实施方案

上面包车型客车询问得出了JobCandidateID等于2的应聘者的具有GPA大于可能等于3.8的Education节点。本示例使用xs:decimal类型的值构造器达成了把Edu.GPA的值从xs:string类型转换为xs:decimal类型:

示例:使用“as xs:TYPE”语句

‘) as Result

XQuery表明式的中央满含了概念查询结果的查询表达式。比如,它能够是三个FLWOCR-V表达式(参见本小说节的“FLWOHaval语句”),三个XPath
2.0 表达式(参见本小说节的“XPath
2.0表明式”),也许别的一个XQuery表明式比方三个布局或算术表明式。

                element Level { data($ED/RES:Edu.Level) },

                <JobTitle>Software Engineer</JobTitle>

FROM [HumanResources].[JobCandidate]

示例:使用max()函数

 

PRIMARY KEY CLUSTERED 

上面包车型大巴查询利用sum()和count()函数计算了London和拉各斯的周周平均最高和压低的温度。

        </Employement>

•        若是单个XML实例必要重新组织,那么能够选择XQuery和FO汉兰达XML。但XQuery可能更实用,因为FO大切诺基 XML需求XML实例中更加多的XML数据类型音信。

        delete (/JobCandidate/Skills/Skill[.=sql:variable(“@Skill”)])

        </NewYork>

引用:

 

                <Boston>

        <Asset>

        $ED 

XML实例:

示范:使用where语句选取具有的家园地址

                  string($EMP/RES:Emp.JobTitle) )

                        <OrgName>ABC Technologies</OrgName>

        else

        return 

SELECT JobCandidateID, Resume

导言

•       
Castable表明式能够检查确认一个原子值是或不是足以调换为内定的类型。实施方案—使用表明式“empty(data($x))
or not(empty(T($x)))” 代替“$x castable as T?”。

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

你能够选择节点相比运算符来明显2个节点是或不是代表长久以来类节点。节点比较运算符是二元操作符,每一种操作元都是node类型。

  <AdmissionDetails>

WHERE JobCandidateID = 3

          <Employment>

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

where $i < $j

          }

DECLARE @Weather xml

            <Item>Electrolyte Solutions</Item>

                <Organization>ABC
Technologies</Organization>

•        数值函数(functions on numeric values): abs(),
round-half-to-even()。

return sum($i + $j)

          element Education

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

场景2:病例系统

•        child 是axis的定义。

                <EndDate>2003-05-09</EndDate>

SQL Server 贰零零柒中XML数据类型完结了ISO
SQL-二〇〇〇尺码XML数据类型。它不止能够存款和储蓄结构能够的XML1.0文书档案,也能积攒根节点为文本的所谓的XML内容段落,也能积存满含自由数目根成分的故事情节。针对富有独具特殊的优越条件格式数据的自笔者研讨已经做到,这一个检查不必把XML数据类型绑定到XML
Schemas。这些尚未非凡格式的数额没办法被检查。

          element ComputerName {
data(/AssetInfo/SystemInfo/ComputerName) },

本文为对SQL Server 二零零五中XQuery的基本知识感兴趣的读者提供就学音讯。SQL
Server
2006中,XQuery语言的不等特色,满含不支持的表征,都在本文中展开了座谈。小说中也示范了XQuery语言分歧特点的使用实例。文中的XQuery应用场景能够帮忙顾客鲜明何种情形下适合使用XQuery。

          {

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

•        ns 是命名空间前缀。

 

示例:使用string()函数

                element Degree { data($ED/RES:Edu.Degree) },

                element Degree { string($ED/RES:Edu.Degree)},

        [ModifiedDate] [datetime] NOT NULL DEFAULT (getdate())

    <Department>Pediatrics</Department>

‘) as Result

          element Education

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

          element EmpID { data($PA/Employee/EmployeeID) },

上边包车型地铁询问通过连接起来日期,截止日期,职业单位名称和职位来营造应聘者专门的学业经历的XML:

        UPDATE [CandidateInfoXMLDataType]

 

XPath2.0简介

    <DateAdmitted>2004-05-02</DateAdmitted>

‘) as Result

正如运算符

SQL Server 二〇〇六通过内置XML数据类型协理XML数据的本地化存款和储蓄。XQuery
1.0本子是经World Wide Web Consortium (W3C)
XML查询工作组定义,基于XML数据的公式化查询语言。XQuery,像SQL一样,是一种注脚性的询问语言,就不啻大家在上面包车型客车篇章准将会看出的一致,能经过宗旨的SQL和X帕特h知识来轻易地精晓它。

        declare namespace
RES=””;

                element GPAScale { string($ED/RES:Edu.GPAScale)}

        SET NOCOUNT ON;

                <Temp Date=”2004-11-05″ High=”52″ Low=”36″ />

WHERE CustomerID = 3

XQuery内置函数

当Schema是不可见的时候,非类型化的XML就很有用。当Schema可知,但它的变通一点也不慢以致于很难保险的时候,或然当存在八个Schema,最终的绑定取决于外界的急需时,非类型化的XML也很有用。其他,当XML
Schema中满含数据库引擎不帮忙的XML
Schema结构时,非类型化的XML也很有用。在那一个景况下,你能够动用在公私语言运行时(CLGL450)客户自定义功能中的System.XML验证器来提供一蹴而就验证。

        </Name>    

WHERE JobCandidateID = 3

值类型构造器

                element StartDate { string($EMP/RES:Emp.StartDate) },

在SQL Server 2006中,XQuery帮衬cast as TYPE
?操作符,能够成功显式类型调换。使用xs:TYPE()构造器也足以完毕显式类型调换,而且写起来也比cast
as TYPE ?操作符更轻松。

        WHERE JobCandidateID = @JobCandidateID

                <Skill>ASP.NET</Skill>      

                else

DECLARE @major varchar(20)

下边包车型大巴询问利用last()函数得到某应聘者的终极二个address节点。

        then

‘) as Result

/* Stored procedure to delete a specified skill element for a candidate
*/

举个例子参照表明式(表明式2)不能静态地方统一标准识有些节点,那么插入操作败北,并赶回四个静态错误。

 

FROM [Sales].[Store] Store 

XML数据类型的法门

                element AnnualSales {
string((/ST:StoreSurvey/ST:AnnualSales)[1]) },

引用:

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

•        不帮衬从外表导入schema。

SQL Server
二〇〇七中的多少个XQuery表明式蕴涵四个部分—前缀(prolog)和大旨(body)。前缀能每一种注脚包括的命名空间。命名空间的评释能够通过照射前缀和命名空间的UEscortI,使您可见用前缀来替代查询体中的命名空间的U智跑I。通过默许申明命名空间(declare
default
namespace)的注脚,你不要绑定成分名称的暗中认可命名空间就可以引用成分的名称。

聚集函数输入三个节点系列,然后重临连串的聚焦值。在SQL Server
二零零七中,XQuery近年来扶助的聚众函数是count()、min()、max()、avg()和sum()。个中,独有协理gt操作的门类(i.e.、多少个放置算数基本项目、日期类型、xs:string、xs:boolean和xdt:
untypedAtomic)技术应用min()和max()函数。三个函数不协助混合类型的队列。更上一层楼,xdt:untypedAtomic被以为是xs:double类型。

上面包车型地铁询问得出了JobCandidateID等于3的应聘者的从业经历。

Example: Updating a skill

‘) as Result

        [JobCandidateID] [int] IDENTITY(1,1) NOT NULL,

表 3 SQL Server2006支持的运算符

AS

•        你能够使用五个XML
DML语句来布局二个XML实例。但以此法子的实践功能鲜明低于XQuery构造器。

        </InsuranceInfo>

引用:

</WeatherInfo>’

相关文章