在Oracle数据库中使用XML数据获取业务信息

日期: 2011-05-18 作者:Jeff McCormick翻译:冯昀晖 来源:TechTarget中国 英文

点击查看:在Oracle 11g R2中使用XML 第一部分 第二部分   既然我们的XML和关系型结构都定义好了,我们就可以查询和操作XML数据了。请注意,下面的插入,更新和删除代码语句是直接针对XML表进行操作。要完整地从SQL应用程序提取XML代码,你可以为这些数据操纵语句操作在关系型视图上创建“Instead of”触发器。   首先,XML数据被直接提取到了XML表中,我们使用了一个带有XML类型函数的SQL插入语句。

XML文档可能会很复杂。在处理规范化的数据模型时,单个XML插入可以替代几十条关系型插入语句。  insert into abc_purc……

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

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

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

点击查看:在Oracle 11g R2中使用XML 第一部分 第二部分

  既然我们的XML和关系型结构都定义好了,我们就可以查询和操作XML数据了。请注意,下面的插入,更新和删除代码语句是直接针对XML表进行操作。要完整地从SQL应用程序提取XML代码,你可以为这些数据操纵语句操作在关系型视图上创建“Instead of”触发器。

  首先,XML数据被直接提取到了XML表中,我们使用了一个带有XML类型函数的SQL插入语句。XML文档可能会很复杂。在处理规范化的数据模型时,单个XML插入可以替代几十条关系型插入语句。

 insert into abc_purchase_order values
 (xmltype(
 '<?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>'
 ));

  接下来,我们的SQL应用程序可以通过查询我们前面创建的关系型视图搜索并提取我们的采购订单元素。记得我们的主从结构吧,XML文档中的每个“PurchaseOrder ”(XML文档)会形成一行,每个“LineItem”(集合)也会形成一行。有了我们的关系型视图,我们现在就可以像查看关系型表的列与行一样查看XML数据。

  从执行计划可以看到,在关系型视图中用到了我们的结构化XMLIndex索引来优化查询。还要注意的是,我们的采购订单表已经建立了引用(Id 8)。这是为了支持智能分区连接和分区表及索引修剪。正如我们前面提到的,我们已经创建了一个非分区的采购订单表,查询结果完全来自隐含的XMLIndex内容表。

 select order_number

 ,order_date

 ,customer_name

 ,description

 ,partno

 ,quantity

 ,unitprice

 from abc_po_master_detail_view

 where customer_name = 'Joe Smith';

 ORDER_NUMBER ORDER_DATE CUSTOMER_NAME DESCRIPTION PARTNO QUANTITY UNITPRICE

 ------------ ---------- ------------- ----------- ------ -------- ---------

 11111 15-JAN-10 Joe Smith Bubble Gum 7155 2 19.95

 11111 15-JAN-10 Joe Smith Blow Pops 3742 2 15.95

 -- Explain (statistics have been previously gathered)

 select * from table(dbms_xplan.display_cursor(null,null,'allstats cost last'));

 ------------------------------------------------------------------------------------------------

 | Id | Operation | Name | E-Rows | Cost (%CPU)|

 ------------------------------------------------------------------------------------------------

 | 0 | SELECT STATEMENT | | | 2 (100)|

 | 1 | PX COORDINATOR | | | |

 | 2 | PX SEND QC (RANDOM) | :TQ10000 | | |

 | 3 | NESTED LOOPS | | | |

 | 4 | NESTED LOOPS | | 1 | 2 (0)|

 | 5 | NESTED LOOPS | | 1 | 2 (0)|

 | 6 | PX BLOCK ITERATOR | | 1 | 2 (0)|

 |* 7 | TABLE ACCESS FULL | ABC_PO_IDX | 1 | 2 (0)|

 |* 8 | TABLE ACCESS BY USER ROWID | ABC_PURCHASE_ORDER | 1 | 1 (0)|

 |* 9 | INDEX RANGE SCAN | SYS108405_108413_PKY_IDX | 1 | 0 (0)|

 | 10 | TABLE ACCESS BY GLOBAL INDEX ROWID| ABC_PO_LINEITEM_IDX | 1 | 1 (0)|
 ------------------------------------------------------------------------------------------------

  Oracle XML数据库还支持对我们的采购订单按片段更新。修改可以是对某一个元素内容的更新或者完全替换一个元素。下面的更新SQL语句就是修改“SPECIALINSTRUCTIONS ”元素文本节点值的两个例子。请注意“WHERE ”从句可以使用“XMLExists ”函数代码或者前面创建的虚拟列。一定要注意虚拟列的简单性和直接使用XML函数的潜在性能收益之间的平衡。

  -- 使用XMLExists 函数
  UPDATE abc_purchase_order po
  SET po.OBJECT_VALUE =
  updateXML(po.OBJECT_VALUE, '/PurchaseOrder/SpecialInstructions/text()', 'Priority Overnight')
  WHERE XMLExists('$po2/PurchaseOrder[OrderNumber="11111"]'PASSING OBJECT_VALUE AS "po2");
  -- 使用虚拟列
  UPDATE abc_purchase_order
  SET OBJECT_VALUE =
  updateXML(OBJECT_VALUE, '/PurchaseOrder/SpecialInstructions/text()', 'Priority Overnight')
  WHERE Order_Number=11111;

  最后,与从一个表删除行类似,我们可以删除XML结构的采购订单。为了编码简化,我们这里使用了一个虚拟列。

  delete from abc_purchase_order where order_number = 11111;

  XML数据存档和清除

  只需要通过从一个XML表中提取数据,我们就能发送XML格式化的采购订单给下游使用,这与需要更多转换步骤的多个关系型表才能实现形成明显对比。现在我们准备支持ILM策略了。我们基于日期的分区模式通常用来在删除数据之前,迁移目前比较过时的采购订单,转向更低层次,更廉价的存储,这样以满足法规遵从的要求。

  -- 数据归档
  alter table abc_purchase_order move partition yr_2010 tablespace ;
  -- 数据删除
  alter table abc_purchase_order drop partition yr_2010 update global indexes;

相关推荐