解析Oracle 11g R2中的XML功能

日期: 2011-03-15 作者:Jeff McCormick翻译:孙瑞 来源:TechTarget中国 英文

XML数据在企业应用中的应用越来越广泛,而数据库在XML数据管理方面也扮演了一个重要的角色。但是目前为止,有许多Oracle数据库从业人员对于Oracle XML来说还是比较陌生的,他们还没有习惯将XML维护放到自身的日常管理工作中来。   但是随着Oracle 11g R2数据库的推出,这一情况将有所改变。最新版本数据库软件中的XML功能让DBA可以更加轻松地进行XML数据管理实践,并且将SQL应用的影响降到了最低程度。

在本文的数据集成应用案例中,我们将向您展示XML数据的关系型访问,并同时介绍Oracle 11g R2数据库在这方面的功能增强。   Oracle 11g R2中XML数据的……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

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

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

XML数据在企业应用中的应用越来越广泛,而数据库在XML数据管理方面也扮演了一个重要的角色。但是目前为止,有许多Oracle数据库从业人员对于Oracle XML来说还是比较陌生的,他们还没有习惯将XML维护放到自身的日常管理工作中来。

  但是随着Oracle 11g R2数据库的推出,这一情况将有所改变。最新版本数据库软件中的XML功能让DBA可以更加轻松地进行XML数据管理实践,并且将SQL应用的影响降到了最低程度。在本文的数据集成应用案例中,我们将向您展示XML数据的关系型访问,并同时介绍Oracle 11g R2数据库在这方面的功能增强。

  Oracle 11g R2中XML数据的关系型访问

  XML数据集成在目前的企业IT部门中已经受到了越来越多的重视,而且这部分功能在数据库方面的应用更加广泛,实现也相对简单。XML文档通常是首先进行分割,然后再放入到关系表中来被SQL应用所访问。文档分割是一种相对复杂的操作,有些时候甚至是费力不讨好的。另一种更好的方式就是省略文档分割这一步,直接将XML数据放入数据库之中,然后在XML结构之上添加一个关系型视图。

  在下面的一个示例中,我们演示了如何使用Oracle自带的XML数据库功能来实现对XML数据的关系型访问。

   '<?xml version="1.0"?>
  <PurchaseOrder>
  <OrderNumber>11111</OrderNumber>
  <OrderDate>2010-01-15</OrderDate>
  <CustomerName>Joe Smith</CustomerName>
  <User>JSMIT</User>
  <SpecialInstructions>Air Mail</SpecialInstructions>
  <LineItems>
     <LineItem ItemNumber="1">
      <Description>Bubble Gum</Description>
      <Part Id="7155" UnitPrice="19.95" Quantity="2"/>
     </LineItem>
     <LineItem ItemNumber="2">
      <Description>Blow Pops</Description>
      <Part Id="3742" UnitPrice="15.95" Quantity="2"/>
     </LineItem>
  </LineItems>
  </PurchaseOrder>'

  如下所示,ABC Gum公司的数据集成hub需要从源系统中接收XML文档。公司正在寻找一个简单的解决方案,可以使用Oracle数据库处理格式良好的XML文档,并以关系型的方式进行展现。这样公司基于SQL的应用就可以在数据发布到XML应用之前对数据进行控制、归档和清洗操作。

  注意该XML文档包含了一个LineItem集合(重复元素),它与一个master-detail模型相类似。

  创建XML表、关系型视图和索引

  我们首先从创建一个单一的schema-less XML表来存储复杂订单开始。注意创建表的时候选择XML数据类型,或者选择XML类型的列。到目前为止,我们已经将一个多表关系型数据模型简化为一个单一的物理表了。

    create table abc_purchase_order of xmltype

  (constraint abc_purchase_order_pk primary key (order_number))

  xmltype store as securefile binary xml

   (compress high)

  virtual columns

   (order_number as (xmlcast(xmlquery('/PurchaseOrder/OrderNumber' passing object_value returning content) as number (5)))

   ,order_date as (xmlcast(xmlquery('/PurchaseOrder/OrderDate' passing object_value returning content) as date))

   )

  partition by range (order_date)

   (

    partition yr_2010 values less than(to_date('01/01/2011','mm/dd/yyyy'))

    ,partition yr_2011  values less than (to_date('01/01/2012','mm/dd/yyyy'))

   )

 ;

  Oracle 11g R2中值得注意的XML功能增强包括针对LOB存储、二进制XML类型存储和分区的SECUREFILE。SECUREFILE比BASICFILE更适合LOB存储,究其原因有以下几点:去重、压缩、加密、缓存以及分段更新等。二进制XML类型存储是一个post-parsed格式,它提供了灵活性、存储优化以及性能增强。分区由虚拟列来实现,它提供了可管理性、可用性以及对信息生命周期管理的支持。

  接下来,我们将通过在XML结构之上创建一个关系型视图的方式来展示订单,让它可以进行SQL访问。这就是视图如何提供并隐藏XML数据结构(如elements)到关系型结构(如列)的转换,通过转换可以使得SQL应用读取XML数据。

    create view abc_po_master_detail_view as

  select m.order_number, m.order_date, m.customer_name, m.userid, m.special_instructions, d.*

   from abc_purchase_order po,

    xmltable('/PurchaseOrder' passing po.object_value

     columns

      order_number number(5) path 'OrderNumber',

      order_date date path 'OrderDate',

      customer_name varchar2(30) path 'CustomerName',

      userid varchar2(10) path 'User',

      special_instructions varchar2(80) path 'SpecialInstructions',

      lineitem xmltype path 'LineItems/LineItem') m,

    xmltable('LineItem' passing m.lineitem

     columns

      itemno  number(10) path '@ItemNumber',

       description varchar2(25) path 'Description',

       partno varchar2(14) path 'Part/@Id',

       quantity number(12,2) path 'Part/@Quantity',

       unitprice number(8,4) path 'Part/@UnitPrice') d;

  然后我们将向XML文档的普通查询部分添加结构化与非结构化的索引,这样可以进一步提升性能。结构化的XML索引组件使用关系型表(关系型索引结构)来组织结构化的XML数据内容,这对于Oracle数据库来说是全新的体验。对于未进行分区的表,定义一个XMLIndex索引将所有在关系型视图中的字段包含进来,可以确保一个关系型视图查询索引结构完全来自于下层的XMLIndex内容表,从理论上来说可以获得关系型的性能。此外,标准关系型二级索引可以在结构化索引的列上创建,高效地进行索引可以使得性能更进一步。

create index abc_purchase_order_ak01 on abc_purchase_order (object_value) indextype is xdb.xmlindex

   parameters

    ('xmltable abc_po_idx ''/PurchaseOrder''

     columns

     order_number  number(5)  path ''OrderNumber''

     ,order_date date path ''OrderDate''

     ,customer_name varchar2(30) path ''CustomerName''

     ,userid varchar2(10) path ''User''

     ,special_instructions varchar2(80) path ''SpecialInstructions''

     ,lineitems xmltype path ''LineItems/LineItem'' virtual

     xmltable abc_po_lineitem_idx ''/LineItem'' passing lineitems

    columns

     itemno number(10) path ''@ItemNumber''

     ,description varchar2(25) path ''Description''

     ,partno varchar2(14) path ''Part/@Id''

     ,quantity number(12,2) path ''Part/@Quantity''

     ,unitprice number(8,4) path ''Part/@UnitPrice''

   ')

   local parallel;



 -- Create secondary B-tree and Full Text indexes on the structured XML index



 create index abc_purchase_order_ak02 on abc_po_idx (customer_name) local;

 create index abc_purchase_order_ak03 ON abc_po_lineitem_idx (

  关于作者

  Jeff McCormick就职于著名医疗机构,担任首席架构师,同时是Connecticut Oracle User Group(康涅狄格州Oracle用户组)的主席。McCormick拥有20余年的IT从业经验,并专注于数据集成与基础架构管理领域,同时拥有包括Oracle、微软以及Sybase在内的多个认证专家证书。

翻译

孙瑞
孙瑞

相关推荐