将同一层次结构级别的两个节点与 PL/SQL 关联

Posted

技术标签:

【中文标题】将同一层次结构级别的两个节点与 PL/SQL 关联【英文标题】:Associating two nodes at the same level of hierarchy with PL/SQL 【发布时间】:2013-02-19 17:47:17 【问题描述】:

我目前正在使用 Oracle 11g 中的 Oracle PL/SQL。 我有两种可以使用的 XML。

以下是两种类型的 XML 示例以及我到目前为止所做的提取。

类型 1 XML:

<ListItens1 xmlns=“xpto”>
<item id=”1”>
    <product type=”fruit”>
        <model> Apple </model>
        <date>02/19/2013</date>
        <year>2013</year>
    </product>
</item >
<item id=”2”>
    <product type=”notebook”>
        <model> Vostro </model>
        <date>02/19/2013</date>
        <year> 2013 </year>
    </product>
</item>
</ListItens1>

类型 2 XML:

<ListItens2 xmlns=“xpto”>
 <item>1</item>
 <product type=”fruit”>
    <model> Apple </model>
    <date>02/19/2013</date>
    <year>2013</year>
 </product>
 <item>2</item>
 <product type=”notebook”>
    <model> Vostro </model>
    <date>02/19/2013</date>
    <year> 2013 </year>
 </product>
<ListItens2>

这些 XML 被插入到一个表中,该表具有一个名为 Archive 的 XMLTYPE 类型的字段。

CREATE TABLE XML_PRODUCT ( ID_XML NUMBER, DATA DATE, ARCHIVE XMLType);

当 XML 是类型 1 时,我这样做没有问题:

SELECT 
  ExtractValue( value( NFe ) , '/item/@id', 'xmlns="xpto' ) ID,
  ExtractValue( value( NFe ) , '/item/product/@type', 'xmlns="xpto' ) TYPE,
  ExtractValue( value( NFe ) , '/item/product/model', 'xmlns="xpto' ) MODEL,
  ExtractValue( value( NFe ) , '/item/product/date'', 'xmlns="xpto' ) DATE,
  ExtractValue( value( NFe ) , '/item/product/year'', 'xmlns="xpto' ) YEAR,
FROM XML_PRODUCT,
  TABLE( XMLSequence( Extract ( ARCHIVE,  '/listItens1/item', 'xpto' ) ) ) NFe
WHERE ID_XML = 1;

结果:

 ID |  TYPE     | MODEL  |    DATE    | YEAR 
-----------------------------------------------
 1  |  fruit    | Apple  | 02/19/2013 | 2013   
 2  |  notebook | Vostro | 02/19/2013 | 2013  

但是对于 TYPE 2,我不知道如何在 ITEM 和 PRODUCT 之间进行关联,因为它们在 XML 中处于同一层次。

是否可以在不修改 XML 的情况下提取与商品关联的产品数据?

【问题讨论】:

【参考方案1】:

您可以先提取项目计数,然后从中获取产品发生率。

select id_xml, 
       extractvalue(xml, '/item['||r||']', 'xmlns="xpto"' ) item,
       extractvalue(xml, '/product['||r||']/@type', 'xmlns="xpto"' ) type,
       extractvalue( xml , '/product['||r||']/model', 'xmlns="xpto"' ) model,
       extractvalue(xml , '/product['||r||']/date', 'xmlns="xpto"' ) dte,
       extractvalue( xml , '/product['||r||']/year', 'xmlns="xpto"' ) year
  from (select id_xml, extract(archive, '/ListItens2/*', 'xmlns="xpto"') xml, rownum r
           from xml_product,
                table(xmlsequence(extract(archive, '/ListItens2/item', 'xmlns="xpto"'))) nfe
          where id_xml = xxx);

【讨论】:

以上是关于将同一层次结构级别的两个节点与 PL/SQL 关联的主要内容,如果未能解决你的问题,请参考以下文章

Hive - 将层次结构表展平为级别

确定 PL/SQL 过程的调用层次结构

确定层次结构中的两个节点是不是已连接

Oracle PL/SQL:如何根据同一记录的 ID 字段返回字符串值?

Python:从项目层次结构中同一级别的另一个目录导入模块

在同一级别创建 2 个子剑道网格