Joh*_*ohn 5 xml sql oracle xpath oracle11g
这是一个示例表:
create table xmltemp (mydoc xmltype)
Run Code Online (Sandbox Code Playgroud)
这是一个小的xml doc:
insert into xmltemp values (
xmltype
('<?xml version="1.0"?>
<countries>
<country>
<name>Canada</name>
</country>
<country>
<name>US</name>
<states>
<state>
<name>Washington</name>
<name>Oregon</name>
</state>
</states>
</country>
</countries>
')
)
Run Code Online (Sandbox Code Playgroud)
请注意,加拿大没有"州"元素,但美国却有.我正在尝试获取这些查询结果(顺序和格式不重要):
Canada,
US,Washington
US,Oregon
Run Code Online (Sandbox Code Playgroud)
当我执行此操作时,我在结果中看到加拿大和美国:
select
countryname
from xmltemp,
xmltable('/countries/country' passing mydoc
columns countryname varchar2(10) path 'name')
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我得到两个状态:
select
statename
from xmltemp,
xmltable('/countries/country/states/state/name' passing mydoc
columns statename varchar2(20) path '.') c
Run Code Online (Sandbox Code Playgroud)
我试过这个以获得国家和州,但似乎oracle不喜欢'..'语法:
select
statename
from xmltemp,
xmltable('/countries/country/states/state/name' passing mydoc
columns statename varchar2(20) path '.',
countryname varchar2(20) path '../../../name') c
Run Code Online (Sandbox Code Playgroud)
继承人错误:
ORA-19110: unsupported XQuery expression
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,由于以下两种状态,我得到"多项目"错误:
select
countryname,
statename
from xmltemp,
xmltable('/countries/country' passing mydoc
columns countryname varchar2(10) path 'name',
statename varchar2(20) path 'states/state/name') c
Run Code Online (Sandbox Code Playgroud)
这是错误:
ORA-19279: XPTY0004 - XQuery dynamic type mismatch: expected singleton
sequence - got multi-item sequence
Run Code Online (Sandbox Code Playgroud)
什么是一个查询,它将获得我想要的输出:
Canada,
US,Washington
US,Oregon
Run Code Online (Sandbox Code Playgroud)
谢谢
尝试这个:
select X.COUNTRYNAME, Y.STATENAME
from XMLTEMP
,xmltable('/countries/country'
passing MYDOC
columns COUNTRYNAME varchar2(20) path './name',
STATES xmltype path './states') X,
xmltable('/states/state/name' passing X.STATES
columns STATENAME varchar2(20) path '.') (+) Y
Run Code Online (Sandbox Code Playgroud)
因为您有多个状态,所以您应该连接到另一个 xml 表。由于某些国家/地区没有州,因此需要使用左外连接。我正在使用旧方法,(+)因为我在 10g 上尝试这个,似乎left outer join在 10g 中使用有问题,但显然在11g.
| 归档时间: |
|
| 查看次数: |
13640 次 |
| 最近记录: |