使用 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(不知道)