您的位置:68399皇家赌场 > 虚拟主机 > Oracle XQuery查询、营造和调换XML

Oracle XQuery查询、营造和调换XML

发布时间:2019-09-23 00:55编辑:虚拟主机浏览(120)

    XQuery简介

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

    接下去大家看看如何定义二个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的数额。

    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;

    下边包车型大巴存放进度假定顾客要把三个字符串类型的本领值作为第二个参数字传送递到存款和储蓄进程中。本存款和储蓄进度能够修改为接受一个分包多少个才具成分的XML片段,这样就完结了三回调用存款和储蓄进程就到位多少个手艺节点的删减。

    FOR XML RAW

    将表转变来成分名称是row,属性名字为列名只怕列的外号。
    示例9:将Student表调换为XML格式(FO奇骏 XML RAW)
    Student表的数目如图所示
    图片 1
    实行语句:

    SELECT * FROM Student FOR XML RAW;
    

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

    这一个事例通过运用DECLARE  证明去定义名称叫@ClientList 的变量,当自家注明变量的时候,只须求富含XML的数据类型的名字在变量名后。

    正如您从后边的有的中询问到的,XQuery 是一种用于查询 Oracle 数据仓库储存款和储蓄的 XML 内容的急速方法 - 无论你是拍卖地点存款和储蓄的 XMLType 数据依旧查询基于关周到据构建的 XML 视图。但基于对数码运用的存款和储蓄类型的分歧,XQuery 表达式的施行品质恐怕天堂地狱差异。特别是,Oracle XML DB 能够优化基于由 ora:view 函数创造的 SQL/XML 视图而构建的 XQuery 表明式。对于 XMLType 表或列中存款和储蓄的 XML 数据,只可以对运用结构化(对象-关系)存款和储蓄技艺存款和储蓄的依附XML 格局的 XMLType 数据开展 XQuery 优化。

    逻辑操作符

    FO陆风X8 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方法,查询结果如下图所示
    图片 4

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

    为便利起见,您恐怕需求将此 XSL 样式表保存在数据库中,然后再起头利用它。举个例子,您能够将样式表作为文件能源保存在 Oracle XML DB 新闻库中。执行该操作的措施之一是将样式表作为文件保留到当和姑件系统中,然后使用以下某些互连网球组织议将它移动到 XML 音讯库:FTP、HTTP 或 WebDAV。假使你已经将列表 4 中的 XSLT 样式表作为 orderTotal.xsl 保存在 /public 音信库文件夹中,今后能够按以下示例所示将它用作 XMLTransform SQL 函数的参数(假若你以 OE/OE 的身份登陆):

    SELECT AssetID, AssetDetails.query('

    FOR XML AUTO

    使用表名称作为元素名称,使用列名称作为品质名称,SELECT关键字前边列的顺序用于XML文书档案的层系。
    示例10:将Student表调换为XML格式(FOCRUISER XML AUTO)
    实践语句:

    SELECT * FROM Student FOR XML AUTO;
    

    询问结果如图所示
    图片 5
    图片 6

    总结

     

    大家大致领会了XML在SQLServer 中的轻松利用,从概念到使用方法。也观察了query()检索子集,也能动用value()检索独立的元素属性的值。当然除此而外还会有向exist(``) andnodes() 那样方法,合营语法都是应用,那有个别就不再实行讲了,完全同样。有不精晓的能够私聊。越来越多利用办法还请访谈MSDN来赢得(寻觅XQuery language reference)。

    固然 Oracle 在 Oracle XML DB 中提供了一个自带 XSLT 管理器,但在好些个情状下(特别是在拍卖大型文书档案时),XQuery 对于塑造 XML 更高效。别的,XQuery 表明式平日比为同一作业设计的 XSLT 样式表更具可读性,何况更了解。与 XSLT 一样,XQuery 不但可用于将一个 XML 文书档案调换为另贰个 XML 文书档案,何况还可用以将 XML 转变为另一种基于文本的格式,如 HTML 或 WML。

    语法:

    FOR XML PATH

    PATH情势提供了一种较轻易的点子来混合成分及质量。在PATH方式中,列名或列小名被看做XPATH表明式来管理,这几个表明式内定了何等将值映射到XML中。私下认可境况下,PATH格局为每同样自动生成

    注意:

    因为XQuery是一种极其复杂的语言,大家只是提到了一有些她的零件,如若想要更上一层楼的明亮它怎么行使,请查看MSDN XQuery language reference.

    那大家将来先来经过例子来看一下query()和value 四个章程是怎么样选择XML数据的。供给细心的是自小编接下去的测验情形是SQLServer贰零零捌猎豹CS62。实例中包括了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 中,fn:doc XQuery 函数用于访问 Oracle XML DB 消息库中累积的单个 XML 文书档案。但借使要管理局部具有同等或一般结构的 XML 文书档案(存款和储蓄在同一 XML 信息库文件夹中),应该如何是好?这种情景下,另八个用来拍卖 XML 音信库能源的 XQuery 函数(即 fn:collection)可能会派上用场。本文稍后将介绍多少个有关如何行使 fn:collection XQuery 函数的演示。

                    then

    XML索引

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

     

    询问 昂CoraSS 音信提供

    CREATE TABLE [CandidateInfoXMLDataType]

    FOR XML子句

    因而在SELECT语句中选择FOLANDXML子句能够把数据库表中的数据检索出来并生成XML格式。SQL Server 二零一零扶助FO哈弗XML的多样形式,分别是RAW情势,AUTO情势,EXPLICIT格局和PATH情势。

    XML的数据类型确定保证了你的XML数据被全体的创设保存,同有时间也契合ISO的标准。在概念三个XML数据类型在此以前,大家率先要清楚它的二种范围,如下:

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

    SET @result = '<Result />'

    未有称谓的列

    上面介绍一种简易的FOQX56 XML PATH应用措施

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

    询问结果如图所示
    图片 7

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

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

    询问结果如图所示
    图片 8
    示例12:利用xmlTest表和mainTeacher表查询出xmlTest表中作育>=700分的学员的班老板新闻和学习者消息,并转账成XML格式
    XmlTest表数据如下图所示
    图片 9
    MainTeacher表数据如下图所示
    图片 10
    进行上面包车型地铁言辞

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

    查询结果如下所示

    <result>
      <学生信息 学号="20180105" 姓名="王婷" 班级="高一3班">
        <班主任信息>
          <姓名>师从光</姓名>
          <教师编号>83928182</教师编号>
          <性别>男</性别>
          <年龄>28</年龄>
          <联系电话>15963002120</联系电话>
        </班主任信息>
      </学生信息>
    </result>
    <result>
      <学生信息 学号="20180109" 姓名="甄诚" 班级="高一3班">
        <班主任信息>
          <姓名>师从光</姓名>
          <教师编号>83928182</教师编号>
          <性别>男</性别>
          <年龄>28</年龄>
          <联系电话>15963002120</联系电话>
        </班主任信息>
      </学生信息>
    </result>
    
    • 八个实例的XML列无法蕴含抢先2GB的数据。
    • 三个XML的列不可能是索引。
    • XML对象无法运用Group By的子句中。
    • 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;

            declare namespace RES="";

    开创索引

    为表中有个别列创立索引,须要该列是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
    

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

     

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

    隐式类型转变

    FOR XML EXPLICIT

    同意顾客显式地定义XML树的造型,不受AUTO方式中的各个限制。不可能将FOXC90 XML EXPLICIT直接用在SELECT子句中。
    示例11:将xmlTest表转变为XML格式(FOQashqai XML EXPLICIT)
    XmlTest表的多少如图所示
    图片 11

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

    查询结果如图所示
    图片 12
    图片 13
    在结果图中大家开掘,红框中3个班级音信列在协同,而持有学生都列在高级中学一年级3班下,那不是大家想要的结果,大家盼望每种班级对应自个儿的上学的小孩子。那么哪些化解此类难题啊,那关系到排序。

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

    率先删除代码行末的FO大切诺基 XML EXPLICIT语句,仅仅实行剩下的一对,使结果以表格情势展现,那么结果如下
    图片 14
    其一表格每行的一一也意味着了该表格转化为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]排序。让大家看看结果怎么着。
    运作方面的代码,但不启动FO奥迪Q3 XML EXPLICIT语句,看看表格中多少内容和行顺序是还是不是变动
    图片 15
    如图所示,开掘行数据和学员数量的次第突显精确。运营具备代码得到XML文档,结果如图所示
    图片 16
    鉴于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表,看看每一个班级和它下属学生的层级关系是或不是有误。

    注:写FOTucson XML EXPLICIT代码要留神,层级1的代码中先安装层级结构,不要先急着赋值。在上面层级的代码中对层级第11中学的代码进行赋值,最棒重复赋值,不然就可以见世文中的排序难题。如若某些层级出现重复数据,在该层级的代码前加DISTINCT关键字。消除排序难点最棒的章程是对各类层级的质量重复赋值并在结尾用OGL450DER BY按层级属性排序。

    精心观望地点的XML文书档案,开掘总分属性的值是个float类型,要把它转换来int,只供给把层级3中对总分的赋值代码改成CAST(年级总分 AS int)
    图片 17

    SQL Server对于XML支持的为主在于XML数据的格式,这种数据类型能够将XML的数额存款和储蓄于数据库的指标中,比方variables, columns, and parameters。当你用XML数据类型配置这个目的中的多个时,你钦赐项指标名字就好像你在SQLServer 中钦定一个类型同样。

    应用 XQuery,能够根据 XML 数据以及可以用 XML 表示的非 XML 数据生成 XML 文书档案,无论其地方怎么:无论是存款和储蓄在数据库中、置于网址上、即时创立或然存款和储蓄在文件系统中。但要注意,Oracle XML DB 为针对数据库中存款和储蓄的数码开展的 XML 操作提供了丰富高的天性和可伸缩性。由此,如若你能够完全调整所管理的数量,则最佳将它移动到数据库中。

    FROM [HumanResources].[JobCandidate]

    修改和删除索引(ALTETiguan 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: 使用数字索引来援引元素下的结果

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

     

    主XML索引

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

    本人设定了变量的值,然后选用select 来寻找这几个值。和我们想的同一,它回到了XML的文书档案。如下:

    在列表 1 中的第贰个 PL/SQL 过程中,您只是在 XML 音信库中创设了叁个新文件夹。在该新闻库文件夹中,您随后将积攒此处展现的第贰个PL/SQL 进度中开创的 XML 文书档案。第四个 PL/SQL 进程首首发出 SELECT 语句,该语句使用 XMLQuery SQL 函数基于关全面据创设 XML。对于 XQuery 表明式(XMLQuery 在那边将其当做参数)来讲,请留神嵌套的 FLWOQX56表明式中利用的 ora:view XQuery 函数。在该示例中,ora:view 获取多少个输入参数,即“H凯雷德”和“employees”,它们提示该函数查询属于 H中华V数据库形式的职员和工人表。因而,ora:view 将重回二个表示 HKuga.employees 表行的职员和工人 XML 文书档案种类。但为了节约结果文书档案中的空间,只将前几个职工记录传递给结荚体系。那是透过在 FLWOLacrosse 表明式的 where 子句中钦定 $i/EMPLOYEE_ID <= 102 而达成的。请小心 FLWO逍客 表明式的 return 子句中应用的 xs:string()xs:integer() XQuery 类型表达式。实际上,此处使用的那七个 XQuery 表明式不止将 XML 节点值调换为相应的项目,并且还将提取这几个节点值。随后,生成的职工 XML 文书档案作为 employees.xml 保存到从前在列表 1 中另四个 PL/SQL 进度中创建的 /public/employees XML 音信库文件夹。要保管此操作已到位,可实施以下查询:

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

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

    询问结果如图所示
    图片 18
    点击查询结果
    图片 19
    如想查询标签

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

    结果如图所示
    图片 20

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

    询问结果如图所示
    图片 21

    注: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 '插入节点后信息'
    

    查询结果插入节点后音信如图所示
    图片 22

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

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

    概念二个XML变量

    该查询应生成以下输出:

    SQL Server 2006中的三个XQuery表明式包罗七个部分—前缀(prolog)和主体(body)。前缀能每一种注脚蕴含的命名空间。命名空间的注解能够经过炫酷前缀和命名空间的U奥德赛I,让你可见用前缀来顶替查询体中的命名空间的UXC60I。通过默许表明命名空间(declare default namespace)的评释,你不用绑定成分名称的默许命名空间就能够援引成分的称谓。

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

    可以创设xml类型的变量,参数和列,只怕将XML架构集结和xml类型的变量、参数或列关联,这种情况下,xml数据类型实例称之为类型化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>'
    SELECT @ClientList
    GO
    

    但在好几情形下,很难发掘 XQuery 表明式的哪些构造将使有些查询的性格更加好。那便是为啥最棒在开采阶段使用调治工具的缘由。

    ') as Result

    辅助XML索引

    为了进步主XML索引的习性,能够创制帮忙XML索引。独有创设了主XML索引后技艺创设协理XML索引。援助XML索引分3种:PATH,VALUES和PROPERTY援助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> 下,当然也能够来自区别。

    列表 2:基于关周到据营造 XML 并将其保存到 XML 音信库

    ') as Result

    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表
    

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

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

    (网编:铭铭)

     

    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奥迪Q5ING数据类型手艺转换到XML。
    XML列不可能动用于GROUP BY语句中
    XML数据类型存款和储蓄的数额不可能越过2GB
    XML数据类型字段不能够被设置成主键或许外键或称为其一部分。
    Sql_variant数据类型字段的运用无法把XML数据类型作为种子品种。
    XML列无法钦命为独一的。
    COLLATE子句不可能被选择在XML列上。
    存款和储蓄在数据库中的XML仅援救128级的层系。
    表中最对只可以具有32个XML列。
    XML列不能够加盟到准则中。
    独一可利用于XML列的内置标量函数是ISNULL和COALESCE。
    有着XML数据类型列的表不能够有贰个当先15列的主键。

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

    AS

    XML查询技能

    XML文档以一个纯文本的款型存在,首要用来数据存款和储蓄。不但有助于顾客读取和动用,何况使修改和保卫安全变得更易于。

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

    SET @EducationLevel = 'Bachelor'

    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是贰个可选数据参数,表示将这么些多少行以成分为主干映射。

    ORDERTOTAL
    -------------------------------------------------------------
    
    EABEL-20021009123338324PDT
    1328.05
    
    
    EABEL-20021009123335791PDT
    2067.15
    
    
    EABEL-20021009123336251PDT
    289.6
    
    
    EABEL-20021009123336382PDT
    928.92

    ') as Result

    XQuery 使您可以操作基于 XML 方式以及非基于格局的多少。以下示例演示了哪些使用 XMLTable 函数从 OE 演示数据库格局中询问基于 PurchaseOrder XML 格局的 XMLType 表。

              element OS { data(/AssetInfo/SystemInfo/OS) }

    该查询将扭转以下输出:

            SET NOCOUNT ON;

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

    •        上下文函数(context functions): current-dateTime(), current-date(), current-time(), default-collation(), implicit-timezone()。

    102
    De Haan
    17000
    
    
    7839
    KING
    5000
    
    
    100
    King
    24000
    
    
    101
    Kochhar
    17000

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

    在急需的情形下(举个例子,向 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 基于示例数据库形式 HXC60的私下认可职员和工人涉嫌表中存储的数据创设 XML 文档。

    ') as Result

    该组织应生成以下输出:

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

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

              {

    则 XQuery 表明式再次回到的空连串将与 purchaseorder 表联接,进而包罗在询问总括果聚焦。实际上,那象征输出将不仅仅饱含为顾客EABEL 央浼的订单生成的 OrderTotal 成分,并且还带有为 purchaseorder 表中蕴藏的具备别的订单生成的空行(暗中同意意况下,purchaseorder 表包涵 132 行)。从结果集中拔除空行的法子之一是在 SELECT 语句的 WHERE 子句中应用 existsNode SQL 函数,实际不是在 XQuery 表达式中采纳 WHERE 子句,如下所示:

    Microsoft和ActiveX是微软公司在美利哥和/或任何国家(地区)的注册商标或商标。

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

    引用:

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

     

    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 Employee

    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
    
    

              <PrescriptionDetails>

    该 XQuery 应生成五个 XML 文档,个中积攒 Oracle 本事网 (OTN) 前段时间发布的与 PHP 本事相关的头条新闻列表。所生成的 XML 文档可能如下所示:

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

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

    FROM [HumanResources].[JobCandidate]

    消除质量难题

            declare namespace RES="";

    另一种可以明确抓牢 XQuery 表明式实施质量的技艺是运用绑定动态变量。使用绑定变量(并非将变量串联为字符串)能够使 Oracle 重用 SQL 语句,进而降低解析开销并生硬拉长应用程序的习性。能够在 XMLQuery 和 XMLTable SQL 函数中应用 PASSING 子句将动态变量绑定到 XQuery 表达式。该技艺使您能够依照顾客端代码中总括的参数动态生成 XML。列表 3 中的示例演示了什么在从 PHP 脚本推行的 XQuery 查询中使用绑定变量。

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

    查询 XMLType 数据

            return        

    此时,/public/employees 音信库文件夹应包罗多个文本:acc_dept.xml(由列表 2 中的 PL/SQL 代码生成)和 employees.xml 文件(由列表 1 中的代码生成)。由于这一个 XML 文书档案存款和储蓄在一直以来音信库文件夹中,因而能够使用 fn:collection 函数访谈多个XML 文书档案中存款和储蓄的职工音信。可是,固然这一个 XML 文书档案均含有职员和工人 XML 元素(这一个成分实际上具备一样结构),但 XML 文书档案本身的布局迥然不相同。在 employees.xml 中,文书档案根成分为 EMPLOYEES,而 acc_dept.xml 将 DEPARTMENT 用作根成分。要消除此难点,能够通过 XQuery 使用 XPath // 构造,进而导航到 XML 文书档案中的某些节点,而毋庸钦赐该节点的方便路线。以下示例演示了怎么样在 XQuery 表明式中应用 XPath // 构造:

    return sum($i $j)

    上述查询将管理顾客 EABEL 诉求的装有订单(即存储在 XMLType 的默许PurchaseOrder 表中的订单)并将转变与查询 XMLType 数据部分中的 XQuery 查询同一的输出。

                    <Employer>

    接下去,若是您须要依照 empsbonus.xml 文书档案中存放的数目创制一个表格。在该报表中,您大概非但要包括列表中显示的奖金数目以及各种职工的职工 ID,还要蕴涵他/她的姓名。因而,可以率先应用以下查询生成叁个新的 XML 文书档案(要是你以 HCRUISER/H凯雷德 的身份连接):

    •        改动各类(order):使用order by语句来改动“empty greatest | least”顺序是不协理的。

    正如你从方今的亲自去做中打探到的,在 Oracle XQuery 施行中,doc 和 collection XQuery 函数用于访谈 Oracle XML DB 新闻库中累积的 XML 文书档案。能够经过 XMLTable 和 XMLQuery SQL 函数中的 PASSING 子句动态绑定外部数据源。考虑以下示例。假如你的商城要为那么些从事于 XQ 项目标职工支付奖金。因而,财务部宣布了 empsbonus.xml 文件,个中包罗有身份获得奖金的职工列表以及该列表中输入的各种职员和工人的奖金多寡。empsbonus.xml 文件可能如下所示:

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

    XQuery 与 XSLT

    内外文函数

    你已经在本文领悟到,XQuery 是叁个归咎的查询语言,它提供了一种用于查询、构建和改造 XML 数据的便捷方法。固然 Oracle XQuery 施行让你可以操作任何能够用 XML 表示的多寡(无论它存款和储蓄在数据库中、位于网址上大概存款和储蓄在文件系统中),但将处理的数目移动到数据库中一贯是三个不利的意见。对于数据库中存储的多少,Oracle XML DB(对 XPath 重写使用一样机制)只可以眼看优化管理这些基于以下数据创设的 XQuery 表明式:那几个数量包蕴关全面据、对象-关周密据或行使结构化(对象-关系)存款和储蓄技艺存款和储蓄的依照XML 形式的 XMLType 数据。

            then

    为访谈 Oracle XML DB 新闻库中蕴藏的 XML 数据,Oracle XQuery 引进了 fn:doc 和 fn:collection XQuery 函数。使用 fn:doc,您能够查询 XML 音信库中蕴藏的单个 XML 文书档案,而 fn:collection 让你能够访谈同一信息库文件夹中存款和储蓄的七个 XML 文书档案。

    本示例中,假定数据库AdventureWorks中有表[Sales].[Store],上边包车型客车查询以日圆情势重返CustomerID等于3的饭店的年贩卖额和年薪,以平米方式再次来到货仓的蕴藏面积。

    在 Oracle 数据库 10g 第 2 版中,Oracle 引进了贰个与该数据库集成的全职能自带 XQuery 引擎,该引擎可用来达成与开支协助 XML 的应用程序相关的种种职分。XQuery 是一种用于拍卖 XML 数据模型的询问语言,它其实可操作任何类型的可用 XML 表达的多少。固然 Oracle XQuery 实践令你能够接纳数据库数据和表面数据源,但在拍卖数据库中寄放的结构化数据方面,Oracle XML DB 平常能够显著拉长质量。

    END

    你能够看到,以上突显的查询生成同样的终极结出,但它们的奉行安顿并不一样样。查看最终三个演示中的 XQuery 表达式,您也许会专心到它迭代顶层 PurchaseOrder 成分,在那之中的种种PurchaseOrder 元素都意味依据 PurchaseOrder XMLType 情势的表中的一整套。那意味实际上海重型机器厂写 XQuery 表达式,以迭带基础对象表(用于存款和储蓄分解的 PurchaseOrder 文书档案)中的行。与查询要迭代不代表基础表中的单个行的 XML 元素相比较,该情势的习性越来越好有的。

     

    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;

            order by $EMP/RES:Emp.StartDate

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

            <Education>      

    上述查询是二个关于怎么样行使 XQuery 基于 XML 和非 XML 数据(以不相同的章程从分裂的数目源中检索)生成 XML 文书档案的示范。具体来说,使用 ora:view() 函数访谈 HR 演示格局中的暗中同意 employees 关系表,并使用 PASSING 子句中的 httpuritype() 函数借助于 HTTP 访问 empsbonus.xml 文书档案。然后,在 FLWOR 表明式的 return 子句中营造新的 XML 文书档案。最终,将获取以下 XML 文书档案:

    表 2  axes缩写语法

    100
    SKING
    AD_PRES

            return 

    询问外界数据源

     

    正如本文在此以前(参阅使用关全面据创设 XML部分)介绍的亲自过问所示范,使用 fn:doc 特别轻便直接。它获得表示信息库文件财富 (U智跑I) 的字符串并回到该 U奥迪Q3I 指向的文书档案。要打听 fn:collection XQuery 函数的功力,同一文件夹中足足应该多个音信库文件。倘使已经运转了列表 第11中学的代码,则早已创建了 /public/employees 新闻库文件夹并在里头蕴藏了 employees.xml 文件。由此,您将需求在该公文夹中最少更创立贰个 XML 文件,然后技巧试用 fn:collection。列表 2 中的 PL/SQL 代码基于 SCOTT/TIGEOdyssey 演示数据库情势的 dept 和 emp 表存储的关全面据创设XML,然后将转换的 XML 文书档案作为 acc_dept.xml 保存到 /public/employees 消息库文件夹。要运行列表 2 中的 PL/SQL 进度,请保管以 SCOTT/TIGEQashqai的身份登陆。

    你能够使用as语句来注脚for语句中利用的包扎变量的门类。

    由于 KugaSS 新闻提供精神上是二个托管的 XML 文件(福特ExplorerSS 音信阅读器从中获得头条音信或别的剧情),因而能够像管理任何其余能够透过 Web 获得的 XML 文书档案这样来管理它。正如你在本文前边的询问外界数据源部分中所见,能够动用 XQuery 查询别的能够由此 U奥迪Q5L 访问的 XML。您通过 XMLTable 和 XMLQuery SQL 函数中的 PASSING 子句动态绑定全体外界 XML 数据源。以下是二个询问 ENCORESS 音讯提供的 XQuery 示例:

    上边包车型客车查询利用min()函数得出了GPA值最小的education节点。

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

                    <NewYork>

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

    列表 1:使用 ora:view 基于关全面据创立 XML

    FROM [HumanResources].[JobCandidate]

    你能够见见,以上输出蕴含从 employees.xml 和 acc_dept.xml 中收获的员工XML 成分,那个要素表示报酬大于或等于 5,000 欧元的职工。

                    <Symptom>Dehydration</Symptom>

    基于关周全据创设 XML

    SELECT Resume.query('

    那将扭转以下输出:

    当使用XML Schemas时如何实践XQuery

    在骨子里情状中,以上的 XML 文件恐怕置于网址上(因此能够透过互连网获取)、以文件方式积存在当麻芋果件系统中,或以文件能源方式累积在 Oracle XML DB 消息库中。就本示例来讲,该文件位于网站上。为简易起见,能够在目录(Web 服务器在内部蕴藏可从 Web 看到的文书档案)中开创一个职员和工人文件夹,然后在该文件夹中插入 empsbonus.xml 文件,以便能够通过以下 U冠道L 访问 empsbonus.xml 文件:

    Update操作符

    所挑选的寄放模型而不是是影响 XQuery 表达式试行质量的独占鳌头要素。在一些情状下,XQuery 表明式本人的布局也说不定变成品质难点。要监察和控制 XQuery 表达式的个性,能够打印并检讨关联的 EXPLAIN PLAN。在 SQL*Plus 中,只需安装 AUTOTRACE 系统变量,就能够打字与印刷 SQL 优化程序行使的实行路线。但要试行该操作,请确定保证成立 PLUSTRACE 剧中人物,然后将其予以连接到数据库所采纳的客商。有关怎样执行此操作的音讯,请参阅 Oracle 数据库 10g 第 2 版 (10.2) 文书档案中《SQLPlus 顾客指南和参照他事他说加以考察》一书中的“调节SQLPlus”一章。以下示例演示了何等通过检查 EXPLAIN PLAN 生成的实行布署来获取收益。要是你曾经将 PLUSTRACE 剧中人物赋予暗许客户 OE,以 OE/OE 的身价登陆并运营以下查询:

            declare namespace RES="";

    总结

                    <Result>Home address precedes Permanent address</Result> 

    列表 3:使用绑定变量

            replace value of  (/JobCandidate/Skills/Skill[.=sql:variable("@SkillOld")]/text())[1]

    
    100
    Steven King
    1200
    
    
    101
    Neena Kochhar
    1000
    

    XPath 2.0表达式

    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,并且还演示了何等监督和深入分析 XQuery 表明式的特性试行,进而找到更连忙的章程来管理同一专业负荷。

            [PatientRecord] [xml] NOT NULL,

    原文:Oracle XQuery查询、营造和转变XML 回去数据库首页

    WHERE JobCandidateID = 3

    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;

              <Therapy>Oral Rehydration Therapy</Therapy>

    您或然对为上述查询生成的实践安顿并不舒适。特别是,所处理的行数大概那么些大。由于 SQL 调度的尤为重要目的是防止访谈对结果未有其余影响的行,因而只怕要持续调度查询以优化质量。对查询中包涵的 XPath 表明式进行双重新创立立模型后,能够再一次重试它,如下所示:

    ) ON [PRIMARY]

    100
    1200
    
    
    101
    1000

              </Employer>

    将 XML 分解为关全面据

                    <Address2>Apt 3344</Address2>      

    将列表 4 中的 orderTotal XSLT 样式表与查询 XMLType 数据部分中的示例使用的 XQuery 表明式实行相比,您只怕会小心到,XQuery 方法要比 XSLT 方法更具吸重力。至少在利用 XQuery 时,您只需编写相当少的代码就能够获得同等的最后结出。

            ')

    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;

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

    http://localhost/employees/empsbonus.xml
    

        <DateDischarged>2004-05-08</DateDischarged>

    查询 Oracle XML DB 音讯库中的 XML 数据

            declare namespace RES="";

    在本文前边的查询 XMLType 数据部分中,您看看了三个关于使用 XQuery 将贰个XML 文书档案调换为另三个 XML 文书档案的身体力行。具体来讲,该示例使用 XQuery 表明式总括示例数据库格局 OE 的 purchaseorder 表中存放的订单的订单一共,然后为拍卖的各种订单生成了贰个 OrderTotal XML 成分。实际上,您能够应用 XSLT 施行同一操作。为此,您首先必要创制一个使用于 PurchaseOrder XML 文书档案的 XSLT 样式表,以调换对应的 OrderTotal 成分。对于此示例,能够动用列表 4 中所示的 XSLT 样式表。

    相比较起在客户端管理XML进程,在劳务器端使用XQuery来管理XML进程要享有越多的长处。个中有的亮点能够总括如下:

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

            declare namespace RES="";

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

    value() 方法是用来从叁个XML文书档案数据值中领到关系型数值。那些形式指引一个用来甄别单个XML节点的XQuery表达式并赶回期望获取的SQL类型。XML节点的再次回到值被转移为钦点的SQL类型。

    举例应用程序管理关周密据而非 XML,而你需求探问的数码以 XML 格式存款和储蓄,则将 XML 分解为关周到据可能会要命有效。继续拓宽上部分的示范,您能够应用 SQL 函数 XMLTable 将职工 XML 成分分解为设想表的单个列,如下所示:

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

    要赚取一样的结尾结出,能够改用 XMLQuery 函数。但假诺将上二个示范中行使的 XQuery 表明式参数字传送递给 XMLQuery(如下所示):

            /RES:Resume/RES:Employment

    但在付出实际应用程序时,您将很也许供给 XQuery 表达式直接生成 HTML 标志,实际不是只是转移三个如上所示的 XML 文书档案。那样,您便得以创设多个越来越灵敏、可维护性越来越高的应用程序,原因是在这种情形下,所有奥迪Q5SS 管理(从提取须求的数据到将它包裹在 HTML 标识中)都将更改来数据库。那使您不要编写肩负 大切诺基SS 管理的应用程序代码。实际上那意味你不要在例如 TucsonSS 信息提供的组织早就改成的图景下修改应用程序代码。相反,您只需修改用于 PRADOSS 处理的 XQuery 表明式。

                    <Temp Date="2004-11-02" High="58" Low="42" />

    
    100
    King
    24000
    
    
    101
    Kochhar
    17000
    
    
    102
    De Haan
    17000
    

    SELECT Resume.query('

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

    </PatientRecord>

    结论

    ') as Result

    上边包车型客车询问相比较了JobCandidateID等于3的应聘者的多少个address节点的依次。

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

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

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

    演示:使用return语句选取历史专门的学问

    BEGIN

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

    <PatientRecord>

                    <Temp Date="2004-11-03" High="60" Low="40" />

    示例:使用position()函数

    语法

    WHERE JobCandidateID = @JobCandidateID

    至上施行和指点宗旨

    •        不补助从外表导入schema。

    初稿地址:

            </Asset>

    引用:

    应用XML数据类型的nodes()方法可以较轻巧的把二个XML文书档案分解为关系型数据。nodes()方法接受三个XQuery表明式,并回到三个行集(Rowset),行聚集的每一行都陈述三个由询问表明式所标记出来的上下文节点。XML数据类型的任何措施,如query(), value(),exist(),和 nodes(),都能调用nodes()方法重回的上下文节点。

              </Employment>

      <AdmissionDetails>

    WHERE JobCandidateID = 2

    FLWOR表达式vs. XPath表达式

    演示:使用值类型构造器实现值的结构

     

    上面包车型地铁囤积进度假定客户要把七个字符串类型的技术值作为第一个参数字传送递到存款和储蓄进程中。本存款和储蓄进度可以修改为接受一个暗含多少个技巧成分的XML片段,那样就兑现了三次调用存储进度就做到四个本事节点的插入。

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

                    <Result>Nodes are equal</Result> 

    Where 

    ') as Result

    XQuery是一种用于XML查询的新语言,帮忙基于XPath2.0的数额浏览和搜聚。本章节为大家初叶显示了XQuery语言外省点的剧情,比方XQuery和XPath之间的涉嫌,XQuery的帮助和益处,XQuery的应用领域,XQuery中XML Schema的准绳等等。

    集合函数

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

    XQuery使用XPath2.0表达式查找一个文档中的节点,在三个文书档案中移动节点依旧在文档间活动节点地点。定义移动路线的XPath是一个互相分离的手续组成的不改变队列。每三个手续包括贰个axis,二个node test和七个步骤剖断。

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

    SELECT Resume.query('

    FROM [HumanResources].[JobCandidate]

            </Employement>

    BEGIN

    FROM [HumanResources].[JobCandidate]

            SET NOCOUNT ON;

     

    FROM [HumanResources].[JobCandidate]

    如for语句中的xs:TYPE

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

    正如运算符

                    else

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

    WHERE Store.CustomerID = 4

    XQuery构造器能够在询问中创立XML结构。能够调用构造器的参数饱含成分、属性、管理指令、文本节点和注释。上面譬喻表达了如何成立XML。

     

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

                    <City>Redmond</City>

    引用:

    演示:更新二个技术

    FROM [Sales].[Store] Store 

                    { $EMP/RES:Emp.EndDate }

    FROM [HumanResources].[JobCandidate]

    END

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

    SELECT Resume.query('

     

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

            [PatientID] ASC

     

     

            return 

    For

    •        别的特征:上边包车型地铁风味也不提供帮忙:

    某做事单位的音信本事单位必要付出八个运用来保管硬件道具和软件程序资金财产。这么些利用必得跟踪的硬件的音讯包涵设备编号,客商新闻,管理器/内部存款和储蓄器/BIOS/主板/声卡等体系音信,系统自带的软件,购销音信和版本音讯;应用必需维护的厂商的软件消息包涵软件项目,买入的授权号等等。应用还少不了扩张援救今后或许出现的新基金种类。资金财产管理体系还可以用来生成报表,如硬件应用情形,软件授权号选拔状态和硬件装置的维护花费。在那个情景中,需用在三个表中的同列中保存由不相同schema说明的音讯。七个schema的非类型化XML能够用来保存消息。一个schema collection的类型化XML也能够保存新闻。存款和储蓄成XML数据类型的财力音讯能够使用XQuery来查询。

                    <BachelorDegree>BS</BachelorDegree>      

    《微软SQL Server 2005对XML的支持》(XML Support in Microsoft SQL Server 2005)

    XQuery内置函数

    WHERE JobCandidateID = 3

            @JobCandidateID [int],

    演示:选拔GPA超过3.5的指引背景

    SELECT @Result.query('

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

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

                    <Result>Nodes are not equal</Result> 

    上面包车型客车询问比方表达了contains()函数的用法,查询突显Edu.Degree节点成分值中蕴藏字符串science的应聘者的教育消息。

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

    场合3:资金财产管理种类

    示例:使用avg()函数

    •        contains() 分明第多个操作元中是不是包涵和第二个操作元一样的字符串。寻找字符串的长短要自愧比不上5000(Unicode码)。

    上边包车型大巴查询得出了JobCandidateID等于3的应聘者的address节点值等于Home的要素。

    SQL Server 2006中的XQuery落成了对XQuery 1.0和XPath 2.0内置函数子集的支撑。这个函数包涵数据访问函数、字符串管理函数、聚焦函数、上下文函数、算数函数、布尔值函数、节点函数和系列函数。下边将深入分析对中间的有个别函数。

    超级实行和指引宗旨

              }

    数学生运动算符

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

    上面包车型大巴查询为JobCandidateID等于3的应聘者创建了二个XML文档,其数额选自该应聘者的Education节点:

    XQuery内置函数

     

    《XML数据类型的天性优化》(Performance Optimizations for the XML Data Type )

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

            where $A[ RES:Addr.Type = sql:variable("@AddrType") ]

    •        QNames相关函数(functions related to QNames): resolve-QName(), QName(), namespace-uri-for-prefix(), in-scope-prefixes()。

        <Diagnosis>Diarrhea</Diagnosis>

    •        倘诺想对一个用作某表明式再次来到结果的行列值举行迭代,你能够经过在for语句中绑定一个接二连三结果集值的变量来促成。实例都是由在for语句范围内同有时间维持复制的新因素结合。

                    element CustomerID { sql:column("Store.CustomerID") },

    •        在SQL Server 200第55中学,FO宝马X3XML语句能够行使新品类把询问的结果平素协会成两个XML数据类型的实例。

    ') as Result

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

    WHERE JobCandidateID = 2

    if-then-else语句

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

    XML数据的改造

     

                <Item>Electrolyte Solutions</Item>

              {

    隐式类型转换

    ') as Result

    •        追踪函数(trace function): fn:trace().

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

            SET Resume.modify('

    现行反革命,让大家只要某先生对查看有“胃痛”和“胸闷”症状的病例感兴趣。上边包车型大巴查询得到了全体有“胸闷”和“胸闷”症状的病例。

            return

    •        访问符(accessors):fn:node-name(), fn:nilled(), fn:base-uri(), fn:document-uri()。

                            <AvgLow>{ sum(/WeatherInfo/Boston/Temp/@Low) div count(/WeatherInfo/Boston/Temp/@Low) }</AvgLow>

    •        地点变量(positional variable):地点变量能够使用at语句定义为二个FLWOEvoque语句中的某部分,它能够标志某表明式重临结果中的节点地点。

              {

    XML数据类型的法子

            return

    SELECT Resume.query('

                    { $EMP/RES:Emp.StartDate }

    演示:使用常量表明式

                    { $EMP/RES:Emp.JobTitle }

    示范:结合使用XML数据类型的exist()方法和sql:variable()函数

     

                    <Organization>ABC Technologies</Organization>

    FROM [HumanResources].[JobCandidate]

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

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

    •        尽大概选用可以选拔的体系的性子。它亦可狠抓推行功能和透过静态类型来监测错误。

     

    引用:

     

            }

    示例:使用sql:variable()函数

            declare namespace RES="";

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

      </PatientDetails>

    insert 

     

    示例:使用data()函数

      <ProblemDetails>

                    <Temp Date="2004-11-07" High="58" Low="47" />

            <Boston>

    XQuery的操作

    在装有其余案例中,推荐使用XPath表明式。

                    <Result>Selected node is not an Element</Result> 

    引用:

            UPDATE [CandidateInfoXMLDataType]

     

                    </Boston>

     

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

    XML数据类型协理各种办法来操作XML实例。XML数据类型的方式描述如下:

    最近,让大家假诺专门的工作单位的创设机构正在开展贰个ASP.NET培养磨练,并期望诚邀全部必要培育的职工出席ASP.NET的构建课堂。上面包车型客车查询选拔了具有在评价进程中规定必要经受ASP.NET培养磨练的人士。

    •        XML schema中陈诉的类型音讯被SQL Server用来优化存款和储蓄。

                    { $EMP/RES:Emp.StartDate }

    ') as Result

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

            return

    WHERE JobCandidateID = 3

    •        ns 是命名空间前缀。

     

      <HospitalDetails>

    Axis说明了活动的动向,和上下文节点的关联。SQL Server二〇〇七中帮忙的axes是child, descendant, parent, attribute, self 以及descendant-or-self。

     

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

    ') as Result

            declare namespace RES="";

     

    •        不帮助不一致体系连串的串联,如节点和多少。

            declare namespace RES="";

                    <Result>Selected node is an Element</Result> 

    ') as Result

    FLWOR表达式vs. XPath表达式

    •        提供协会新节点的效应。

    •        concat()连接三个也许几个字符串。

    XQuery表明式的大旨包罗了概念查询结果的查询说明式。比方,它能够是三个FLWOTucson表达式(参见本作品节的“FLWOPAJERO语句”),二个XPath 2.0 表明式(参见本小说节的“XPath 2.0表明式”),恐怕另外一个XQuery表明式比方三个结构或算术表明式。

    普通相比较运算符

                <Item>Pepto-Bismol</Item>

    SELECT Resume.query('

     

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

     

    WHERE JobCandidateID = 2

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

            </Name>    

     

    上边包车型大巴询问得出了有着StartDate大于xs:date类型构造的值的Employment节点:

    •        倘使您想依靠一个轻便表达式对结果集实行排序,那么可以运用order by语句实现。

                    <NewYork>

    上面包车型客车贮存进度允许客商插入特定应聘者的有个别新技术。本存款和储蓄进度选择sql:variable()函数来做客XML DML语句中的Transact-SQL变量。越来越多关于如何在XML中绑定非XML关系型数据的剧情,参见《关系型列和变量的走访》(Accessing Relational Columns and Variables)。

            declare namespace RES="";

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

              }

            declare namespace RES="";

    本文由68399皇家赌场发布于虚拟主机,转载请注明出处:Oracle XQuery查询、营造和调换XML

    关键词: 68399皇家赌场 数据库 Sql Server 数据库开发 XQuer

上一篇:CentOS小说 - 5.CentOS7安装Sql Server 2017

下一篇:没有了