在表(SQL)和Query中加载XML

时间:2013-08-23 07:47:15

标签: sql xml database oracle oracle10g

我用谷歌搜索但似乎无法找到一个直接的答案。我有一个简单的表,我在其中加载了一个完整的XML文件的内容。现在我尝试查询XML数据并给它一个结构化的概述,这个工作,但我需要一些解释。

我的问题(请参阅下面的二手数据):

  • 有人可以解释我如何扩展我的查询,所以我也可以从XML部分'AddressC'查询数据。现在我只能从'AddressB'获取数据。

  • 这部分做了什么,以及为什么有一个网址(我已经从internetz复制了查询): xmltable(xmlnamespaces('http://www.w3.org/2001/XMLSchema-instance'as“xsi” “)

* 表格中的XML(XML_FILES2,表格包含两个单元格test1和test2):*

<PurchaseOrder>
  <AddressB>
    <Name>Ellen Adams</Name>
    <Street>123 Maple Street</Street>
    <City>Mill Valley</City>
    <State>CA</State>
    <Zip>10999</Zip>
    <Country>USA</Country>
  </Addressb>
  <AddressC>
    <Name>Tai Yee</Name>
    <Street>8 Oak Avenue</Street>
    <City>Old Town</City>
    <State>PA</State>
    <Zip>95819</Zip>
    <Country>USA</Country>
  </AddressC>
</PurchaseOrder>

我使用的查询

SELECT street
FROM xml_files2 xf, xmltable(xmlnamespaces('http://www.w3.org/2001/XMLSchema-instance' as "xsi"),
'PurchaseOrder/Addressb' passing xf.test2
columns 
street varchar2(100) path 'Street'
) PurchaseOrder;

1 个答案:

答案 0 :(得分:0)

您的XML无效。结束标记Addressb与开始标记AddressB不匹配。

如果您的问题只是一个拼写错误,这里是一个以XML格式从各种父母那里阅读Street元素的示例。

CREATE TABLE T1 (C1 XMLTYPE);

INSERT INTO T1 VALUES (XMLTYPE('<PurchaseOrder>
  <AddressB>
    <Name>Ellen Adams</Name>
    <Street>123 Maple Street</Street>
    <City>Mill Valley</City>
    <State>CA</State>
    <Zip>10999</Zip>
    <Country>USA</Country>
  </AddressB>
  <AddressC>
    <Name>Tai Yee</Name>
    <Street>8 Oak Avenue</Street>
    <City>Old Town</City>
    <State>PA</State>
    <Zip>95819</Zip>
    <Country>USA</Country>
  </AddressC>
</PurchaseOrder>'));


SELECT STREET FROM T1, XMLTABLE('PurchaseOrder/*' PASSING T1.C1 
    COLUMNS 
        STREET VARCHAR2(100) PATH 'Street'
    ) PURCHASEORDER;

结果:

STREET                                                                                             
----------------------------------------------------------------------------------------------------
123 MAPLE STREET                                                                                     
8 Oak Avenue