通过整个 XML 结果提取单个重复 XML 节点
Extract single repeating XML node through whole XML result
给定以下 XML 示例,我如何使用 Oracle XML 提取从上到下提取所有 <table_no>
值。
基于以下内容,我希望从我的 select 中看到以下各行:
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>
可以使用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 是 table 中的字符串(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;
如果它已经是 XML输入 table,您将跳过该转换:
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
给定以下 XML 示例,我如何使用 Oracle XML 提取从上到下提取所有 <table_no>
值。
基于以下内容,我希望从我的 select 中看到以下各行:
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>
可以使用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 是 table 中的字符串(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;
如果它已经是 XML输入 table,您将跳过该转换:
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