在定义一个XML数据类型之前,可用于SQL语句或者作为存储过程的参数

可以把它用在任何普通SQL数据类型可以使用的地方,可用于SQL语句或者作为存储过程的参数,这种数据类型可以将XML的数据存储于数据库的对象中,在定义一个XML数据类型之前,尽管 Oracle XQuery,但在处理数据库中存储的结构化数据方面,SQL Server 2005中的XML数据类型,本文介绍了SQL Server,它可以保留XML文档的信息集,XML类型可以存储最大2GB的XML数据

图片 25

XML索引

出于XML数据类型最大可存款和储蓄2GB的多少,由此供给创立XML索引来优化查询质量。

 

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;

WHERE JobCandidateID = 3

简介

Teradata数据库 (以下简称TD) 为存款和储蓄和管理XML数据提供以下帮助:

  • XML数据类型,允许顾客以严刻二进制格局存储XML内容,用来保留XML文书档案的消息集
  • 支撑常见XML操作,如分析,验证,调换(XSLT)和询问(XPath和XQuery)等和艺术
  • 用以查询和调换XML内容的XQuery查询语言
  • 积攒进程,允许顾客以XML格式发表SQL查询的结果
  • 征服功用,允许顾客从XML文书档案中领到值并应用它们来更新数据库表

FOCRUISER XML的嵌套查询

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

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方法,查询结果如下图所示
图片 1

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

以那一件事例通过动用DECLARE  评释去定义名称叫@ClientList
的变量,当笔者注脚变量的时候,只要求满含XML的数据类型的名字在变量名后。

你可能对为上述查询生成的施行安顿并不好听。非常是,所管理的行数恐怕非常大。由于
SQL
调解的要害目的是防止采访对结果尚未别的影响的行,由此大概要继续调解查询以优化品质。对查询中隐含的
XPath 表明式进行重复建立模型后,可以另行重试它,如下所示:

数值比较运算符

XML 数据类型

TD为XML数据提供了XML数据类型。你能够像使用其余TD扶助的SQL数据类型一样使用它。它能够保留XML文书档案的消息集,包涵从XML验证派生的档期的顺序结构音讯和类型音信。XML类型能够积攒最大2GB的XML数据,并帮衬XML管理效果。

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

注:删除主索引,与其唇齿相依的具备协理索引也会被删除。由此地点语句中去除学生消息表索引后,协艺术学生音信表索引也被删去了。

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,何况还亲自过问了怎么监察和控制和解析 XQuery
表明式的习性实践,进而找到越来越高效的章程来拍卖同一工作负荷。

SELECT Demographics.query(‘

创办新的XML类型实例

你能够通过以下办法创造XML类型实例:

  • New 操作符
  • CREATEXML 函数
  • XMLPARSE 函数

诸如以下例子,大家借使XML数据以文件方式被载入到customerText表的customerXMLText
(VARCHAOdyssey可能CLOB类型)的列中。然后我们能够运用New
操作符来从以文件表明的XML数据中开创一个XML实例。

SELECT customerID, (NEW XML(customerXMLText)).XMLEXTRACT('/Customer/Address', NULL)
FROM customerText;

询问的结果如下:

customerID NEW XML(customerXMLText).XMLEXTRACT('/Customer/Address', Null)
-------------------------------------------------------------------------
1 <Address>100 1st Street, San Francisco, CA 94118</Address>

同等地大家也用用CREATEXML来创制相应实例:

SELECT customerID, (CREATEXML(customerXMLText)).XMLEXTRACT('/Customer/Address', NULL)
FROM customerText;

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数据类型的施用范围
独有STLX570ING数据类型技术调换来XML。
XML列不能够应用于GROUP BY语句中
XML数据类型存款和储蓄的数据无法超过2GB
XML数据类型字段不可能被设置成主键只怕外键或称为其一部分。
Sql_variant数据类型字段的采纳不可能把XML数据类型作为种子项目。
XML列无法钦定为独一的。
COLLATE子句无法被采纳在XML列上。
积累在数据库中的XML仅补助128级的层系。
表中最对只好具备33个XML列。
XML列不能够加盟到法规中。
独一可接纳于XML列的内置标量函数是ISNULL和COALESCE。
装有XML数据类型列的表不能有三个超过15列的主键。

注意:

因为XQuery是一种特别复杂的语言,大家只是提到了一片段她的机件,假若想要更上一层楼的明白它怎么运用,请查看MSDN XQuery
language
reference.

那我们明日先来由此例子来看一下query()和value
五个点子是何许运用XML数据的。需求稳重的是自己接下去的测量检验情状是SQLServer二〇〇八LX5702。实例中包含了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: 创设测量试验碰着和多少

102
De Haan
17000


7839
KING
5000


100
King
24000


101
Kochhar
17000

            <Item>Electrolyte Solutions</Item>

范例

该语句创建二个含有XML类型列customerXML的表:

CREATE TABLE customer (
    customerID INTEGER,
    customerName VARCHAR(256),
    customerXML XML 
)  PRIMARY INDEX (customerID);

XML查询才能

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的数目。

正如您在此此前方的示范中打听到的,在 Oracle XQuery 实施中,doc 和 collection
XQuery 函数用于访谈 Oracle XML DB 音讯库中蕴藏的 XML 文书档案。能够由此XMLTable 和 XMLQuery SQL 函数中的 PASSING
子句动态绑定外界数据源。思考以下示例。假若你的小卖部要为那个从事于 XQ
项目标职工付出奖金。因而,财务部公布了 empsbonus.xml
文件,其中蕴含有身份获得奖金的职工列表以及该列表中输入的每种职员和工人的奖金数额。empsbonus.xml
文件只怕如下所示:

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

用法

您能够内定XML类型:

  • 在表定义中
    注意:XML类型是LOB类型,最多一行占用40九十七个字节。思考到一个64K的行大小,你能够在单个表上定义不抢先拾几个XML类型的列。
  • 用作存款和储蓄进程中的IN,OUT或INOUT参数
  • 用作结构化UDT的一片段

INSERT and UPDATE statements can also assign XML type values to
columns.

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表

询问结果如图所示
图片 2
双击展开查看XML

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

SQL
Server对于XML扶助的骨干在于XML数据的格式,这种数据类型可以将XML的数额存款和储蓄于数据库的靶子中,举个例子variables,
columns, and
parameters。当您用XML数据类型配置那几个目标中的贰个时,你内定项指标名字就如你在SQLServer
中钦命三个项目同样。

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构造器可以在询问中创设XML结构。能够调用构造器的参数包涵元素、属性、处理指令、文本节点和注释。下边比如表达了何等创立XML。

转换

从其余SQL类型调换为XML类型时,an XML value of the nearest xml schema
primitive type is created. 。 举个例子,VARCHA昂Cora /
CLOB的xs:string和DATE的xs:date。在向另贰个主旋律调换时,XML实例的字符串值应该与指标数据类型包容。
比如,将xs:date值转变为SQL DATE类型。
以下数据类型协助向和从XML类型转变。
VARCHAR | CLOB | VARBYTE | BLOB | BYTEINT | SMALLINT
INTEGER | DATE | DECIMAL | FLOAT | NUMBER |BIGINT
TIME | TIME WITH TIMEZONE
TIMESTAMP | TIMESTAMP WITH TIMEZONE

注意:从大指标类型(CLOB和BLOB)调换为XML类型受限于其大小,唯有小于64K能力成功转移。

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

能够成立xml类型的变量,参数和列,恐怕将XML架构集合和xml类型的变量、参数或列关联,这种情景下,xml数据类型实例称之为类型化xml实例。不然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>
下,当然也得以来自分歧。

XQuery 与 XSLT

最后,count()函数再次回到种类中节点的多少。

限制

你不可能将XML类型钦命为:

  • UDF或UDM中的输入参数或结果类型
  • 表面存款和储蓄进程中的IN,OUT或INOUT参数

UDF,UDM和外界存款和储蓄进度只可以将XML数据管理为VARCHA揽胜,CLOB,VARBYTE或BLOB值;
因而,在将XML值传递给外界例程在此之前,必需运用XMLSE昂CoraIALIZE函数将XML值系列化为VARCHARubicon,CLOB,VARBYTE或BLOB值。
您能够利用CREATEXML函数将表面例程的结果转化为XML类型值。

  • XML类型能够包容最大2GB的值。However, operations like XSLT and
    XQuery are only supported on documents that are smaller in size
    where the processing operation does not require more memory than
    specified by the XML_MemoryLimit DBS Control field.
  • XML类型的列不能够:
    • 留存于队列表中
    • 成为索引的一部分
    • 参与JOIN操作
  • 您不能够在依附于排序或相比较的子句中利用XML类型的列,例如ORDER
    BY,GROUP BY或HAVING。
  • 您不能够在算术表明式中使用XML值。
    XML值能够是二个品种,如xs:int,可用以算术总括。
    在这种情状下,您能够将XML值调换为适龄的SQL类型来实践总结。
  • XML类型值不具备可比性,不应在关乎比较操作中应用(举例>,<,=)。
    XML值能够显式转变为另外标量SQL类型,这个体系的值大概是可正如的。
    比如,要是已知该值是XML类型xs:int,则足以将其转移为SQL整数数据类型。

注意:因为XML值不负有可比性,所以它们不带有在对行重复的反省立中学(譬喻,在插入到一个集表中)。
这种行为看似于也不参加行重复检查的CLOB / BLOB类型。

  • 固然XML值的表面表示是字符串类型,不过字符串操作不能够直接在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>的子元素

询问结果如图所示
图片 3
点击查询结果
图片 4
如想查询标签

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

结果如图所示
图片 5

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

查询结果如图所示
图片 6

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

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

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

询问结果如下图所示
图片 8

总结

 

咱俩基本上了然了XML在SQLServer
中的轻巧利用,从概念到使用方法。也见到了query()检索子集,也能应用value()检索独立的因素属性的值。当然除外还恐怕有向exist(``)
andnodes()
那样方法,同盟语法都以使用,这一部分就不再进行讲了,一模一样。有不知底的能够私聊。愈来愈多采纳办法还请访谈MSDN来获得(寻找XQuery
language reference)。

在 Oracle 数据库 10g 第 2 版中,Oracle
引进了二个与该数据库集成的全职能自带 XQuery
引擎,该引擎可用来完毕与开拓援救 XML 的应用程序相关的各个职分。XQuery
是一种用于拍卖 XML 数据模型的询问语言,它其实可操作任何项指标可用 XML
说明的数码。即便 Oracle XQuery
施行使您能够行使数据库数据和表面数据源,但在管理数据库中蕴藏的结构化数据方面,Oracle
XML DB 平常可以显然提升品质。

        }

数量迁移

要将积累在VARCHA酷路泽或CLOB列中的XML数据迁移到具备XML类型列的同样情势,请试行以下操作:

  1. 验证XML数据是或不是格式精确,并符合XML格式的平整。
  2. 利用XML类型为保存XML数据的列创制新本子的表。
  3. 选拔NEW XML运算符或CREATEXML函数将XML文本插入到XML列中。
FOR XML AUTO

动用表名称作为成分名称,使用列名称作为质量名称,SELECT关键字前边列的相继用于XML文书档案的层系。
示例10:将Student表转变为XML格式(FOEnclave XML AUTO)
试行语句:

SELECT * FROM Student FOR XML AUTO;

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

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

为方便起见,您或者须要将此 XSL
样式表保存在数据库中,然后再起来利用它。比如,您能够将样式表作为文件资源保存在
Oracle XML DB
新闻库中。实施该操作的章程之一是将样式表作为文件保留到地面文件系统中,然后采取以下有个别网络公约将它移动到
XML 新闻库:FTP、HTTP 或 WebDAV。要是你曾经将列表 4 中的 XSLT 样式表作为
orderTotal.xsl 保存在 /public
新闻库文件夹中,未来得以按以下示例所示将它用作 XMLTransform SQL
函数的参数(倘让你以 OE/OE 的身价登陆):

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

排序

XML值不享有可比性。 在别的借助比较值(如O酷威DEXC60 BY,GROUP
BY或DISTINCT)的子句中援用XML类型列都会招致错误。

从不称谓的列

上边介绍一种轻巧的FO奥迪Q3 XML PATH应用措施

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

查询结果如图所示
图片 11

注:固然提供了空字符串FOCRUISER XML PATH(‘’)则不会变卦任何因素。

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

查询结果如图所示
图片 12
示例12:利用xmlTest表和mainTeacher表查询出xmlTest表中成就>=700分的学习者的班老总消息和学习者新闻,并转账成XML格式
XmlTest表数据如下图所示
图片 13
MainTeacher表数据如下图所示
图片 14
施行下边的口舌

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>

本身设定了变量的值,然后选用select
来搜索那么些值。和大家想的同等,它回到了XML的文书档案。如下:

查询 奥迪Q7SS 音信提供

引用:

XQuery简介

XQuery是一种查询语言,能够查询结构化或然半结构化的数码。SQL Server
二〇〇八中对XML数据类型提供了支撑,能够存款和储蓄XML文书档案,然后利用XQuery语言进行询问。

 

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

        where contains($ED/RES:Edu.Degree, “Science”)

FOR XML RAW

将表转变来成分名称是row,属性名字为列名或许列的小名。
示例9:将Student表转变为XML格式(FOLX570 XML RAW)
Student表的数额如图所示
图片 15
施行语句:

SELECT * FROM Student FOR XML RAW;

询问结果如图所示
图片 16
图片 17

XML的数据类型确认保障了你的XML数据被完整的营造保存,同时也符合ISO的正统。在概念贰个XML数据类型在此之前,大家首先要理解它的二种范围,如下:

列表 3 中显示的脚本应生成以下输出(注意,浏览器中或许不会来得标识):

BEGIN

辅助XML索引

为了巩固主XML索引的习性,能够创建支持XML索引。独有成立了主XML索引后技巧创制协理XML索引。援救XML索引分3种:PATH,VALUES和PROPERTY援救XML索引。

  • 贰个实例的XML列不可能包括抢先2GB的数据。
  • 三个XML的列无法是索引。
  • XML对象不可能使用Group By的子句中。
  • XML的数据类型不帮忙比较和排序。

如上查询将管理顾客 EABEL 央求的有所订单(即存款和储蓄在 XMLType 的默认PurchaseOrder 表中的订单)并将扭转与查询 XMLType 数据部分中的 XQuery
查询同一的输出。

FLWOR表达式vs. XPath表达式

FOR XML EXPLICIT

允许客户显式地定义XML树的形态,不受AUTO形式中的各类限制。不能够将FOCRUISER XML
EXPLICIT间接用在SELECT子句中。
示例11:将xmlTest表转换为XML格式(FOXC60 XML EXPLICIT)
XmlTest表的数量如图所示
图片 18

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

查询结果如图所示
图片 19
图片 20
在结果图中大家开采,红框中3个班级消息列在同步,而颇具学生都列在高级中学一年级3班下,那不是我们想要的结果,我们愿意各种班级对应自个儿的学生。那么如何消除此类难题呢,这件事关到排序。

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

第一删除代码行末的FO本田UR-V XML
EXPLICIT语句,仅仅奉行剩下的片段,使结果以表格格局呈现,那么结果如下
图片 21
这几个表格每行的次第也意味了该表格转化为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的代码功能是设置XML格式的,对数码排序未有影响。在底下几个层级的赋值部分,每个层级的代码中都对地点多少个层级的要素重复赋值,那样做使结果的表格中不再有那么多属性值是NULL,能够一本万利排序。最终再依照成分[班级消息!2!班级]和[学生消息!3!学号!Element]排序。让我们看看结果如何。
运行方面的代码,但不运营FOENCORE XML
EXPLICIT语句,看看表格中数据内容和行顺序是或不是改换
图片 22
如图所示,发掘行数据和学生数量的逐个显示准确。运转具备代码获得XML文档,结果如图所示
图片 23
是因为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安德拉 XML
EXPLICIT代码要留心,层级1的代码中先安装层级结构,不要先急着赋值。在部属层级的代码中对层级1中的代码进行赋值,最佳重复赋值,不然就能够见世文中的排序难题。若是有些层级出现重复数据,在该层级的代码前加DISTINCT关键字。化解排序难题最佳的不二诀假若对种种层级的性质重复赋值并在最后用OEvoqueDER
BY按层级属性排序。

紧凑侦查地点的XML文档,发掘总分属性的值是个float类型,要把它转变来int,只须求把层级3中对总分的赋值代码改成CAST(年级总分
AS int)
图片 24

<!-- 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>
http://www.w3.org/1999/XSL/Transform" version="1.0">



























表:

FOR XML PATH

PATH形式提供了一种较简单的法子来混合成分及质量。在PATH方式中,列名或列别称被用作XPATH表明式来管理,那几个表达式内定了怎样将值映射到XML中。暗许情状下,PATH形式为每同样自动生成

概念贰个XML变量

那将扭转以下输出:

示例:使用data()函数

主XML索引

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

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

                element GPA { $ED/RES:Edu.GPA cast as xs:decimal? },

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是多个可选数据参数,表示将这一个多少行以成分为大旨映射。

列表 2:基于关全面据营造 XML 并将其保存到 XML 音讯库

        return 

创建索引

为表中有个别列创制索引,供给该列是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

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

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

Path表达式:

FOR XML子句

透过在SELECT语句中接纳FOEscortXML子句可以把数据库表中的数据检索出来并生成XML格式。SQL Server
2010支撑FOENVISIONXML的多样形式,分别是RAW形式,AUTO形式,EXPLICIT方式和PATH形式。

在急需的事态下(比如,向 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奔驰M级的私下认可职员和工人涉嫌表中蕴藏的数额营造 XML 文档。

        return

100
1200


101
1000

脚下在SQL Server
二零零六中,XQuery还不援救let语句。那上头越多内容可参见本文章节“不协助的特点和职业中的实施方案”。

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;

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

另一种能够分明加强 XQuery
表达式实践质量的技艺是应用绑定动态变量。使用绑定变量(并不是将变量串联为字符串)能够使
Oracle 重用 SQL 语句,进而减弱深入分析开销并刚毅增加应用程序的性质。能够在
XMLQuery 和 XMLTable SQL 函数中应用 PASSING 子句将动态变量绑定到 XQuery
表明式。该技术让你能够依照客商端代码中总结的参数动态生成 XML。列表 3
中的示例演示了如何在从 PHP 脚本实行的 XQuery 查询中使用绑定变量。

 

在列表 1 中的第多个 PL/SQL 进程中,您只是在 XML
消息库中开创了三个新文件夹。在该新闻库文件夹中,您随后将积累此处显示的第三个PL/SQL 进度中创建的 XML 文书档案。第3个 PL/SQL 进度首头阵出 SELECT
语句,该语句使用 XMLQuery SQL 函数基于关全面据营造 XML。对于 XQuery
表明式(XMLQuery 在此处将其视作参数)来讲,请留神嵌套的 FLWOGL450表明式中应用的 ora:view XQuery 函数。在该示例中,ora:view
获取多少个输入参数,即“H奇骏”和“employees”,它们提示该函数查询属于 H兰德酷路泽数据库方式的职员和工人表。由此,ora:view 将回到二个代表 HSportage.employees
表行的职工 XML
文书档案种类。但为了节约结果文书档案中的空间,只将前八个职员和工人记录传递给结果系列。这是经过在
FLWO奥迪Q3 表明式的 where 子句中钦赐 $i/EMPLOYEE_ID <= 102
而落到实处的。请小心 FLWO昂科拉 表明式的 return 子句中采纳的 xs:string()
xs:integer() XQuery 类型表明式。实际上,此处使用的那八个 XQuery
表明式不仅仅将 XML
节点值调换为相应的连串,何况还将领到这么些节点值。随后,生成的职员和工人 XML
文档作为 employees.xml 保存到事先在列表 1 中另三个 PL/SQL 进程中开创的
/public/employees XML 音信库文件夹。要保障此操作已形成,可进行以下查询:

•        在FLWOR语句中扩大了order by语句,它能够对文档数据进行再次排序。

您能够看出,以上输出包涵从 employees.xml 和 acc_dept.xml 中获得的职工
XML 成分,那么些要素表示薪水大于或等于 5,000 日元的职工。

不协理的本性和做事中的技术方案

但在支付实际应用程序时,您将极大概必要 XQuery 表明式直接生成 HTML
标志,实际不是一味转移贰个如上所示的 XML
文档。那样,您便足以营造多少个越来越灵活、可维护性更加高的应用程序,原因是在这种情景下,全体KoleosSS 管理(从提取要求的多少到将它包裹在 HTML
标志中)都将改动成数据库。那让你不要编写肩负 揽胜SS
管理的应用程序代码。实际上那象征你不要在诸如 中华VSS
消息提供的结构早就改变的气象下修改应用程序代码。相反,您只需修改用于 PAJEROSS
管理的 XQuery 表明式。

下边包车型地铁询问检查鲜明二个用xPath表明式标记的address节点的系列是不是是element()类型:

列表 3:使用绑定变量

END

该组织应生成以下输出:

 

该 XQuery 应生成二个 XML 文书档案,个中积存 Oracle 手艺网 (OTN) 方今发表的与
PHP 技艺相关的头条新闻列表。所生成的 XML 文书档案或然如下所示:

SQL Server 贰零零陆中的XQuery实现了对XQuery 1.0和XPath
2.0内置函数子集的支撑。那么些函数满含数据访谈函数、字符串管理函数、集中函数、上下文函数、算数函数、布尔值函数、节点函数和类别函数。上边将解析对中间的一部分函数。

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;

上面包车型大巴询问得出了JobCandidateID等于2的应聘者的具备GPA大于或许等于3.8的Education节点。本示例使用xs:decimal类型的值构造器完结了把Edu.GPA的值从xs:string类型调换为xs:decimal类型:

列表 1:使用 ora:view 基于关周密据创建 XML

WHERE JobCandidateID = 3

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

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

在上述 XQuery 中,fn:doc XQuery 函数用于访谈 Oracle XML DB
音信库中蕴藏的单个 XML 文书档案。但万一要拍卖部分独具同样或貌似结构的 XML
文书档案(存款和储蓄在同一 XML
消息库文件夹中),应该如何做?这种情景下,另三个用以拍卖 XML
音讯库财富的 XQuery 函数(即
fn:collection)恐怕会派上用场。本文稍后将介绍多少个有关怎样利用
fn:collection XQuery 函数的自己要作为范例遵从规则。

WHERE
Appraisal.exist(‘/PerformanceAppraisal/TrainingNeeds/Technical/Skill/text()[contains(.,”ASP.NET”)]’)
= 1

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

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

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

归来数据库首页

        </Skills> 

如上查询是二个关于如何运用 XQuery 基于 XML 和非 XML
数据(以差别的艺术从分裂的多寡源中检索)生成 XML
文书档案的身先士卒。具体来说,使用 ora:view() 函数访问 HR 演示方式中的暗中认可
employees 关系表,并使用 PASSING 子句中的 httpuritype() 函数借助于
HTTP 访谈 empsbonus.xml 文档。然后,在 FLWOR 表明式的 return
子句中营造新的 XML 文书档案。最终,将获得以下 XML 文书档案:

                <PhoneNumber>9870909023</PhoneNumber>    

XQuery 使您能够操作基于 XML
形式以及非基于格局的数额。以下示例演示了怎么着使用 XMLTable 函数从 OE
演示数据库情势中询问基于 PurchaseOrder XML 方式的 XMLType 表。

                        <Result>Home Address</Result> 

该查询应生成以下输出:

FROM [HumanResources].[JobCandidate]

要得到一致的最后结出,能够改用 XMLQuery 函数。但假诺将上叁个示范中选取的
XQuery 表达式参数字传送递给 XMLQuery(如下所示):

        <Asset>

(小编:铭铭)

        return

缓和品质难点

SQL Server
二〇〇五支持多样相比操作符—普通比较运算符、数值相比较运算符、节点相比运算符和节点顺序对比运算符。

依据关全面据构建 XML

        declare namespace
RES=””;

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;

 

接下去,假若您需求凭仗 empsbonus.xml
文书档案中存储的数码创制贰个报表。在该报表中,您也许不唯有要含有列表中展现的奖金数量以及各类员工的职员和工人ID,还要包涵他/她的全名。因而,能够率先利用以下查询生成三个新的 XML
文档(若是你以 HCR-V/H奥迪Q7 的地位连接):

                <MiddleName></MiddleName>      

将 XML 分解为关周到据

 

总结

FROM [HumanResources].[JobCandidate]

100
SKING
AD_PRES

本文基于XQuery 1.0在SQL Server 2007中的实施,同不时候也依据XQuery 1.0
二〇〇四年的做事草图。本文的率先有个别提议了新的XML数据类型的总述以及它的有关特点,接下去的一对,分别地介绍XQuery的延续串操作,XQuery的停放函数,关系型表明式,以及SQL
Server
二零零七不帮助的有的。最终,介绍前段时间的极品应用和引导,XML数据的匡正以及XQuery的运用事例的音讯。

借使应用程序管理关全面据而非 XML,而你要求拜候的多寡以 XML
格式存款和储蓄,则将 XML
分解为关周到据或许会十一分管用。继续开展上有个别的亲自去做,您能够动用 SQL
函数 XMLTable 将职员和工人 XML 成分分解为虚构表的单个列,如下所示:

FROM [HumanResources].[JobCandidate]

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

‘) as Result

则 XQuery 表明式再次来到的空体系将与 purchaseorder
表联接,进而满含在询问总计果聚集。实际上,这意味着输出将不独有包括为用户EABEL 央求的订单生成的 OrderTotal 成分,何况还带有为 purchaseorder
表中蕴藏的持有其余订单生成的空行(暗中认可景况下,purchaseorder 表满含 132
行)。从结果集中清除空行的章程之一是在 SELECT 语句的 WHERE 子句中使用
existsNode SQL 函数,并非在 XQuery 表达式中利用 WHERE 子句,如下所示:

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

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

 

查询外部数据源

引用:

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

AND
AssetDetails.exist(‘/AssetInfo/SystemInfo/OS/text()[contains(.,”Windows
XP”)]’) = 1

您能够看看,以上展现的询问生成一样的终极结果,但它们的实践布置并不一样样。查看最终贰个示范中的
XQuery 表明式,您恐怕会小心到它迭代顶层 PurchaseOrder 成分,个中的每一种PurchaseOrder 成分都意味着依照 PurchaseOrder XMLType
方式的表中的一行。那意味实际上海重机厂写 XQuery
表达式,以迭带基础对象表(用于存款和储蓄分解的 PurchaseOrder
文书档案)中的行。与查询要迭代不表示基础表中的单个行的 XML
成分相比较,该形式的习性更加好有的。

 


100
Steven King
1200


101
Neena Kochhar
1000

        where $ED/RES:Edu.GPA =
min(/RES:Resume/RES:Education/RES:Edu.GPA)

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

          {

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

引用:

应用 XQuery,能够依靠 XML 数据以及能够用 XML 表示的非 XML 数据生成 XML
文书档案,无论其岗位怎么:无论是存款和储蓄在数据库中、置于网址上、即时成立也许存款和储蓄在文件系统中。但要注意,Oracle
XML DB 为针对数据库中寄存的数量实行的 XML
操作提供了十二分高的性质和可伸缩性。因而,若是你可以统统调整所拍卖的多寡,则最佳将它移动到数据库中。

FLWORAV4语句组成了XQuery表明式的主脑,它与SQL的SELECT语句很相像。FLWO本田UR-V(发音同“flower”)是FOEvoque,
LET, WHERE, O福特ExplorerDEENVISION BY,
RETUWranglerN的缩写。XQuery的FLWORubicon表明式能够举办再一次注明、变量绑定、过滤、排序以及重返结果的操作。SQL
Server 二零零五中辅助FO奥迪Q3, WHERE, O锐界DEHighlander BY和 RETU奥迪Q7N:

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入门

http://localhost/employees/empsbonus.xml

 

在其真实景况况中,以上的 XML
文件或然置于网址上(由此得以由此互连网获取)、以文件格局积存在当半夏件系统中,或以文件能源格局储存在
Oracle XML DB
消息库中。就本示例来讲,该文件位于网址上。为简单起见,能够在目录(Web
服务器在中间蕴藏可从 Web
看到的文书档案)中开创贰个职员和工人文件夹,然后在该文件夹中插入 empsbonus.xml
文件,以便可以通过以下 U奥德赛L 访谈 empsbonus.xml 文件:

引用:

出于 福特ExplorerSS 消息提供精神上是多少个托管的 XML 文件(KoleosSS
消息阅读器从中获得头条新闻或别的情节),因而可以像管理其余其余能够因此Web 获得的 XML
文书档案那样来拍卖它。正如您在本文后边的查询外界数据源部分中所见,能够使用
XQuery 查询别的能够经过 U福特ExplorerL 访谈的 XML。您通过 XMLTable 和 XMLQuery SQL
函数中的 PASSING 子句动态绑定全部外界 XML 数据源。以下是贰个询问 奥德赛SS
新闻提供的 XQuery 示例:

•        数学生运动算

以上查询与本有的初阶的 XMLTable 示例生成同样的出口。

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

正如本文从前(参阅使用关周到据创设 XML部分)介绍的以身作则所示范,使用
fn:doc 特别轻松直接。它赢得表示消息库文件财富 (UWranglerI) 的字符串并重回该 U兰德酷威I
指向的文档。要询问 fn:collection XQuery
函数的遵循,同一文件夹中至少应当五个新闻库文件。假如已经运维了列表 第11中学的代码,则已经创办了 /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/TIGEENVISION的地位登入。

SELECT Resume.query(‘

就算 Oracle 在 Oracle XML DB 中提供了二个自带 XSLT
管理器,但在众多状态下(极度是在管理大型文档时),XQuery 对于营造 XML
更迅捷。其它,XQuery 表明式日常比为同一作业设计的 XSLT
样式表更具可读性,而且更清楚。与 XSLT 同样,XQuery 不但可用来将三个 XML
文书档案转变为另三个 XML 文书档案,并且还可用来将 XML
转变为另一种基于文本的格式,如 HTML 或 WML。

    <Name>Robert</Name>

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

上边包车型地铁询问举个例子表明了contains()函数的用法,查询展现Edu.Degree节点成分值中蕴含字符串science的应聘者的教育消息。

将列表 4 中的 orderTotal XSLT 样式表与查询 XMLType
数据部分中的示例使用的 XQuery 表达式举办比较,您也许会专一到,XQuery
方法要比 XSLT 方法更具吸重力。至少在行使 XQuery
时,您只需编写非常少的代码就可以获取一样的末尾结果。

        into (/JobCandidate/Skills)[1]

你已经在本文领悟到,XQuery
是一个总结的查询语言,它提供了一种用于查询、创设和转变 XML
数据的敏捷方法。尽管 Oracle XQuery 实践令你能够操作任何能够用 XML
表示的多少(无论它存款和储蓄在数据库中、位于网址上只怕存款和储蓄在文件系统中),但将管理的数量移动到数据库中一贯是多个科学的主心骨。对于数据库中积累的数额,Oracle
XML DB(对 XPath
重写使用一样机制)只可以眼看优化管理那二个基于以下数据营造的 XQuery
表明式:这几个数量包涵关周全据、对象-关周详据或利用结构化(对象-关系)存储本领存款和储蓄的根据XML 形式的 XMLType 数据。

with

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

EABEL-20021009123338324PDT
1328.05


EABEL-20021009123335791PDT
2067.15


EABEL-20021009123336251PDT
289.6


EABEL-20021009123336382PDT
928.92

GO

所挑选的储存模型并不是是影响 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 的地位登入并运转以下查询:

纵然在XML Schemas聚焦,你有XML
Schemas来汇报您的XML数据,你能够因此关联XML
Schema集和XML列用来提供类型化的XML数据。XML
Schema被用来证明数据的卓有成效;在编写翻译查询也许数额编辑语句时期进行比非类型化XML越来越准确的项目检查;或许被用来优化存储和询问的处理功用。

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

Update操作符

正如你从前边的局地中打听到的,XQuery 是一种用于查询 Oracle 数据仓库储存款和储蓄的
XML 内容的急速方法 – 无论你是拍卖地点存款和储蓄的 XMLType
数据依然查询基于关周全据营造的 XML
视图。但基于对数据采用的积攒类型的比不上,XQuery
表达式的奉行质量也许天壤之隔不一样。特别是,Oracle XML DB 能够优化基于由
ora:view 函数制造的 SQL/XML 视图而塑造的 XQuery 表明式。对于 XMLType
表或列中贮存的 XML 数据,只可以对运用结构化(对象-关系)存储技能存款和储蓄的基于
XML 情势的 XMLType 数据开展 XQuery 优化。

        <Education>      

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

FROM [HumanResources].[JobCandidate]

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一样支持缩写语法来注解axis。上面包车型客车表格列举了axis以及对应的缩写语法。

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

 

查询 XMLType 数据

示范:插入几个新技艺

在本文前边的查询 XMLType 数据部分中,您看看了贰个关于使用 XQuery 将二个XML 文书档案调换为另叁个 XML 文书档案的亲自去做。具体来讲,该示例使用 XQuery
表明式总括示例数据库形式 OE 的 purchaseorder
表中积攒的订单的订单一共,然后为拍卖的各样订单生成了叁个 OrderTotal XML
元素。实际上,您能够运用 XSLT
试行同一操作。为此,您首先必要创建一个选择于 PurchaseOrder XML 文书档案的
XSLT 样式表,以浮动对应的 OrderTotal 成分。对于此示例,能够利用列表 4
中所示的 XSLT 样式表。

‘) as Result


100
King
24000


101
Kochhar
17000


102
De Haan
17000

return

但在一些情状下,很难开采 XQuery
表达式的哪位构造将使有个别查询的习性越来越好。那就是干吗最棒在开拓阶段使用调解工具的来头。

FROM [HumanResources].[JobCandidate]

该查询将扭转以下输出:

          <StoreDetails

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;

•        在改动操作中来实例化XML。

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

xs:TYPE实例

 

示范:使用动态数据

        as last

示例:使用“cast as TYPE ?”操作符

        </InsuranceInfo>

 

        $A 

        [Resume] [xml] NOT NULL,

SELECT Resume.query(‘

•        Addr.Type 是 node test。

引用:

WHERE Resume.exist (‘

 

    <Age>5</Age>

SELECT Resume.query(‘

•        比较XSLT的查询语句,XQuery查询语句代码更简明。

                <Address2>Apt 3344</Address2>      

导言

接下来,输入的表明式必得是八个放置算数函数类型只怕untypedAtomic(但无法是混合型,xdt:untypedAtomic被以为是xs:double类型)的子类型,技能应用avg()和sum()函数。

‘) as Result

上边包车型客车查询将address节点系列绑定在变量$A,变量定义为项目成分(RES:Address):

if-then-else语句

‘) as Result

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

引用:

未来,让大家只要新闻本领部门安排选用预装了微软Windows® XP 和微软 Office
三千软件的微管理器类别。上边包车型地铁询问选取了预装了Windows XP 和 Office
三千的硬件装置列表。

        declare namespace
RES=””;

   Expression2

•       
XQuery的融会应用:当组织初阶放任自个儿个人的购并应用措施,而起头运用标准的以集成应用为底蕴的办法时候,满意把单个应用中内部定义使用的数据转变为标准的能够格式化调换的数指标急需就成为头等首要的难点。因为XQuery能够协会并转变XML数据,所以XQuery就满意了那几个供给。在合龙应用领域,二个拔尖的XQuery应用是把地点使用的XML数据库/关系型数据能源的词汇表,翻译为其余三个应用者的本土XML数据库/关系型格式数据语言。

某做事单位的人力财富部门索要多少个属性评价种类来管理规范的商场业绩考核。日常,评价记录包涵的新闻都以运用自然语言描述的,如人士在评估时期最首重要项目上的变现,表达下三个评估时期的至关重要项内容,注脚职员和工人的养育要求等等。XML是最适合管理那类消息的。人士的评论和介绍音信被保存在类型化XML的列中,使用XQuery能够让顾客在系统中询问并剖判职员的历史表现。更上一层楼说,XML
DML能够修改评价记录。

WHERE
PatientRecord.exist(‘/PatientRecord/ProblemDetails/Symptoms/Symptom/text()[contains(.,”Fever”)]’)
= 1

DECLARE @result xml

                element Degree { $ED/RES:Edu.Degree cast as xs:string?
},

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

在SQL Server 二零零六中,XQuery协理cast as TYPE
?操作符,可以做到显式类型转变。使用xs:TYPE()构造器也能够完结显式类型调换,并且写起来也比cast
as TYPE ?操作符更简短。

        </NewYork>

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

        then

                  string($EMP/RES:Emp.OrgName), “, “,

FROM [HumanResources].[JobCandidate]

        return 

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

这里涉及的忠实公司名称和产品名称恐怕是其个别主人的商标。

    <Department>Pediatrics</Department>

        SET NOCOUNT ON;

        declare namespace
RES=””;

        @JobCandidateID [int],

‘) as Result

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

‘) as Result

 

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

</WeatherInfo>’

FROM [HumanResources].[JobCandidate]

 

 

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

 

          </Employment>

WHERE JobCandidateID = 2

当使用XML Schemas时如何实行XQuery

xs:TYPE实例

示范:使用order by语句对查询出来的历史专门的学问实行升序排序

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

 

某诊所特殊须求多个能获得伤者病情的体系。病例包罗伤者个人音讯,保证消息,病情描述,医务卫生职员确诊,医疗意况等等。能够依附分歧必要对病例举行查询剖判。XML格式上满足是积累病例内容,如症状,核查报告和带有描述音信的看病进程。病例能够积存到XML类型的列中。医院能够行使XQuery来深入分析这么些音信。

        </Address>    

•        逻辑运算 

 

下边举个例子表明了什么样行使replace value
of关键字来更新某一定应聘者的贰个留存技巧值。

FROM [Assets]

XQuery是一种用于XML查询的新语言,援救基于XPath2.0的多少浏览和采撷。本章节为我们开始显示了XQuery语言各方面包车型地铁内容,举个例子XQuery和XPath之间的涉及,XQuery的帮助和益处,XQuery的应用领域,XQuery中XML
Schema的条条框框等等。

        <NewYork>

        declare namespace
RES=””;

•       
质量的精雕细刻:在服务器端使用XQuery写的查询语句能够行使SQL查询器进行优化。那样优化管理的质量要当先在顾客端重新猎取数量并开展数量过滤。其余,还是能够由此为XML数据类型的列成立索引来获得越来越强有力的品质。

                <BachelorDegree>BS</BachelorDegree>      

XQuery内置函数

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

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

          }

XQuery内置函数

•        固然XML的数据来源于多个列和行,那么FOLAND XML是独一无二的挑三拣四。

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

SELECT Resume.query(‘

        declare namespace
RES=””;

        }

‘) as Result

 

亲自去做:转变表store中选定的新闻的值

CREATE PROCEDURE [DeleteSkillInfo]

                $A

 

          {

‘) as Result

          <Employment>

        return

下边包车型客车蕴藏进度假定客商要把八个字符串类型的技术值作为第4个参数字传送递到存储进程中。本存款和储蓄进程能够修改为接受一个满含多个本事成分的XML片段,那样就贯彻了三回调用存款和储蓄进度就实现多个技能节点的插入。

 

上面的询问利用last()函数得到某应聘者的末梢多少个address节点。

WHERE JobCandidateID = 3

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

FROM [HumanResources].[JobCandidate]

上面包车型大巴查询利用avg()函数总结了London和达Russ的每一周平均最高和最低的热度。

 

SET @Weather = ‘

‘) as Result

order by

                { $EMP/RES:Emp.EndDate }

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

WHERE JobCandidateID = 3

AS

正如运算符

上边包车型客车询问得出了JobCandidateID等于3的应聘者的有着address类型节点值不等于Home的要素:

 

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

                <Temp Date=”2004-11-04″ High=”52″ Low=”45″ />

 

类型检查表达式

 

普普通通比较运算符

使用XQuery构造XML

•        改造各种(order):使用order by语句来改换“empty greatest |
least”顺序是不扶助的。

          </StoreDetails>

XQuery应用场景

exist()方法允许客商在XML文书档案中执行查询以确认八个XQuery表明式的结果是不是为空。当XQuery表明式再次回到一个非空的结果时,那个法子的重返值为1;当表达式重回空时,方法重临值为0;当XML实例本人为NULL时,就赶回NULL值。

至上实践和辅导安插

•        假诺您想依赖一个轻巧易行表明式对结果集举行排序,那么可以应用order
by语句达成。

 

 

</PatientRecord>

上边包车型客车询问得出了JobCandidateID等于3的应聘者所从事过的富有专门的学问的早先日期,甘休日期,专门的学问单位名称,工作岗位。

        else

                element Level { $ED/RES:Edu.Level cast as xs:string? },

WHERE JobCandidateID = 3

•        提供组织新节点的功效。

躬体力行:隐式类型调换

涉及项目表明式

        @Skill [varchar](200)

        SET NOCOUNT ON;

如今,让大家若是某先生对查看有“高烧”和“脑仁疼”症状的病例感兴趣。上边包车型大巴询问得到了百分之百有“头痛”和“腹部疼”症状的病例。

WHERE JobCandidateID = 3

        element CustomerInfo

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

                <Boston>

                <Company>Blue Cross Blue Shield</Company>

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

XQuery入门