【问题标题】:Extract single repeating XML node through whole XML result通过整个 XML 结果提取单个重复的 XML 节点
【发布时间】:2019-12-19 21:13:29
【问题描述】:

鉴于下面的 XML 示例,我如何使用 Oracle XML 提取从上到下提取所有 <table_no> 值。

根据以下内容,我希望从我的选择中看到以下单独的行:

1
4
2
11

Table: tickets
Column holding XML: ticket_col 

XML 代码:

<xml>
  <ticket_order>
    <table_no>1<table_no/>
    <waiter>Jack<waiter/>
    <total_people>12<total_people/>
  </ticket_order>
  <ticket_order>
    <table_no>4<table_no/>
    <waiter>Jackie<waiter/>
    <total_people>3<total_people/>
  </ticket_order>
  <ticket_order>
    <table_no>2<table_no/>
    <waiter>Sally<waiter/>
    <total_people>2<total_people/>
  </ticket_order>
  <ticket_order>
    <table_no>11<table_no/>
    <waiter>Mike<waiter/>
    <total_people>6<total_people/>
  </ticket_order>
</xml>

【问题讨论】:

    标签: oracle oracle11g extract oracle-xml-db


    【解决方案1】:

    您可以使用XMLTable();将(固定)示例 XML 作为字符串内嵌:

    select x.*
    from xmltable(
     '/xml/ticket_order'
      passing xmltype('<xml>
      <ticket_order>
        <table_no>1</table_no>
        <waiter>Jack</waiter>
        <total_people>12</total_people>
      </ticket_order>
      <ticket_order>
        <table_no>4</table_no>
        <waiter>Jackie</waiter>
        <total_people>3</total_people>
      </ticket_order>
      <ticket_order>
        <table_no>2</table_no>
        <waiter>Sally</waiter>
        <total_people>2</total_people>
      </ticket_order>
      <ticket_order>
        <table_no>11</table_no>
        <waiter>Mike</waiter>
        <total_people>6</total_people>
      </ticket_order>
    </xml>')
      columns table_no number path 'table_no'
    ) x;
    
      TABLE_NO
    ----------
             1
             4
             2
            11
    

    如果 XML 是表中的字符串(VARCHAR2 或 CLOB),您将通过交叉连接将其传递:

    select x.*
    from your_table t
    cross join xmltable(
      '/xml/ticket_order'
      passing xmltype(t.xml_string)
      columns table_no number path 'table_no'
    ) x;
    

    如果表格中已经是 XMLType,您将跳过该转换:

    select x.*
    from your_table t
    cross join xmltable(
      '/xml/ticket_order'
      passing t.xml
      columns table_no number path 'table_no'
    ) x;
    

    您可以一次获取多个列;并且生成的相关列名不必与节点名相同:

    select x.*
    from your_table t
    cross join xmltable(
      '/xml/ticket_order'
      passing t.xml
      columns table_number number path 'table_no',
        server varchar2(10) path 'waiter',
        covers number path 'total_people'
    ) x;
    
    TABLE_NUMBER SERVER         COVERS
    ------------ ---------- ----------
               1 Jack               12
               4 Jackie              3
               2 Sally               2
              11 Mike                6
    

    Read more.

    【讨论】:

    • 请再进行一次查询 - 我已经看到以下性质的示例:select xmltype(t.ticket_col).extract('//table_no/text()').getStringVal() from ticket t - 这会拉出我所追求的所有 4 条记录吗?
    • @tonyf - 不,它会获取所有值,但会将它们连接成一个结果 - 单个字符串“14211”。与单个 XMLQuery() 调用一样。 XMLTable 旨在将 XML 数据提取为(多行)关系数据。
    • OK - 将使用 XMLQuery() 并让您知道。
    猜你喜欢
    • 2020-05-05
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多