使用 XMLTable 函数从 XML 中提取数据

Posted

技术标签:

【中文标题】使用 XMLTable 函数从 XML 中提取数据【英文标题】:Extracting Data from Xml Using XMLTable Function 【发布时间】:2015-01-12 17:40:16 【问题描述】:

我刚刚开始学习在 PLSQL 中处理 XML 数据,这是我的问题。

创建此问题中使用的表格所需的代码。

 create table purchase_order 
(
data XMLType
);

insert into purchase_order
values(XMLType('<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation=
    "http://localhost:8080/source/schemas/poSource/xsd/purchaseOrder.xsd">
  <Reference>SBELL-2002100912333601PDT</Reference>
  <Actions>
    <Action>
      <User>SVOLLMAN</User>
    </Action>
  </Actions>
  <Reject/>
  <Requestor>Sarah J. Bell</Requestor>
  <User>SBELL</User>
  <CostCenter>S30</CostCenter>
  <ShippingInstructions>
    <name>Sarah J. Bell</name>
    <address>400 Oracle Parkway
      Redwood Shores
      CA
      94065
      USA</address>
    <telephone>650 506 7400</telephone>
  </ShippingInstructions>
  <SpecialInstructions>Air Mail</SpecialInstructions>
  <LineItems>
    <LineItem ItemNumber="1">
      <Description>A Night to Remember</Description>
      <Part Id="715515009058" UnitPrice="39.95" Quantity="2"/>
    </LineItem>
    <LineItem ItemNumber="2">
      <Description>The Unbearable Lightness Of Being</Description>
      <Part Id="37429140222" UnitPrice="29.95" Quantity="2"/>
    </LineItem>
    <LineItem ItemNumber="3">
      <Description>Sisters</Description>
      <Part Id="715515011020" UnitPrice="29.95" Quantity="4"/>
    </LineItem>
  </LineItems>
</PurchaseOrder>'));

我想提取 ItemNumber 、 Description 、 Part Id 、 UnitPrice 、 Quantity 等值并将它们显示为关系表。但我收到错误 ORA-19279。这是我的代码。

select x.*
from purchase_order t,
xmltable('/PurchaseOrder'
passing t.data 
columns Reference varchar2(300) path 'Reference',
Usr varchar2(20) path '//Action',
Requestor varchar2(20) path '//Requestor',
CostCenter varchar2(20) path '//CostCenter',
ShippingInstructions varchar2(500) path '//ShippingInstructions',
SpecialInstructions varchar2(50) path '//SpecialInstructions',
ItemNumber varchar(10) path '//LineItems/LineItem/@ItemNumber',
Description varchar(100) path '//Description'

 ) x

【问题讨论】:

@AlexPoole ORA-19279 XQuery 动态类型不匹配。预期的单例序列 - 得到多项序列。 【参考方案1】:

您需要将多项目 XML 元素从一个级别传递到第二个 XMLTable() 调用:

select x.Usr, -- other x columns, but not LineItems
  y.ItemNumber, y.Description
from purchase_order t,
  xmltable('/PurchaseOrder'
    passing t.data 
    columns Reference varchar2(300) path 'Reference',
    Usr varchar2(20) path '//Action',
    Requestor varchar2(20) path '//Requestor',
    CostCenter varchar2(20) path '//CostCenter',
    ShippingInstructions varchar2(500) path '//ShippingInstructions',
    SpecialInstructions varchar2(50) path '//SpecialInstructions',
    LineItems XMLType path '//LineItems'
  ) x,
  xmltable('/LineItems/LineItem'
    passing x.LineItems
    columns ItemNumber varchar(10) path '//LineItem/@ItemNumber',
    Description varchar(100) path '//Description'
  ) y;

USR                  ITEMNUMBER DESCRIPTION                             
-------------------- ---------- ----------------------------------------
SVOLLMAN             1          A Night to Remember                      
SVOLLMAN             2          The Unbearable Lightness Of Being        
SVOLLMAN             3          Sisters                                  

我只显示了来自x 的一列以防止滚动,但除了传递给第二个XMLTable() 调用的LineItems 列之外,您可以包含所有这些列;所以你不能使用select *

【讨论】:

以上是关于使用 XMLTable 函数从 XML 中提取数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 XMLtable/Xpath 转换 XML Clob 并将其存储在数据库表中

Oracle PL/SQL 使用 XMLTABLE 解析 xml 中的嵌套对象

Oracle XMLTABLE - 如何从 XMLType 中删除节点?

Oracle XMLTable / XMLTYPE(不知道)

为啥在加载到 XMLTABLE 时会跳过 XML 文档的第 40,000 个字符?

使用 Oracle 11g 的 XMLtable