[英]How to parse XML file in Oracle SQL
我從下面的網站下載了每日交換文件到數據庫中。 如何使用Oracle SQL解析以下XML文檔?
“ http://finance.yahoo.com/webservice/v1/symbols/allcurrencies/quote;currency=true?view=basic&format=json”
如果您確實下載了XML版本而不是JSON版本,則可以形成如下基本查詢:
select /*+ cursor_sharing_exact */ id, classname, name, value
from (select rownum id, classname, field_list
from myxml mx cross join
xmltable('/list/resources/resource'
passing xmltype(mx.mydoc)
columns classname varchar2(100) path '@classname',
field_list xmltype path 'field'
)
)
cross join xmltable('/field'
passing field_list
columns
name varchar2(200) path '@name',
value varchar2(200) path '.'
)
這將為您提供如下輸出:
SQL> select /*+ cursor_sharing_exact */ id, classname, name, value
2 from (select rownum id, classname, field_list
3 from myxml mx cross join
4 xmltable('/list/resources/resource'
5 passing xmltype(mx.mydoc)
6 columns classname varchar2(100) path '@classname',
7 field_list xmltype path 'field'
8 )
9 )
10 cross join xmltable('/field'
11 passing field_list
12 columns
13 name varchar2(200) path '@name',
14 value varchar2(200) path '.'
15 )
16 /
ID CLASSNAME NAME VALUE
---------- -------------------- -------------------- --------------------
1 Quote change 0.099976
1 Quote chg_percent 0.009367
1 Quote name USD/KRW
1 Quote price 1067.400024
1 Quote symbol KRW=X
1 Quote ts 1359020860
1 Quote type currency
1 Quote volume 0
您當然可以選擇PIVOT。
with data as (select /*+ cursor_sharing_exact */ id, classname, name, value
from (select rownum id, classname, field_list
from myxml mx cross join
xmltable('/list/resources/resource'
passing xmltype(mx.mydoc)
columns classname varchar2(100) path '@classname',
field_list xmltype path 'field'
)
)
cross join xmltable('/field'
passing field_list
columns
name varchar2(200) path '@name',
value varchar2(200) path '.'
) ) select id, classname,
max(case when name = 'change' then value end) change,
max(case when name = 'chg_percent' then value end) chg_percent,
max(case when name = 'name' then value end) name,
max(case when name = 'price' then value end) price,
max(case when name = 'symbol' then value end) symbol,
max(case when name = 'ts' then value end) ts,
max(case when name = 'type' then value end) type,
max(case when name = 'volume' then value end) volume
from data
group by id, classname
order by id
一個樣本(縮短的數據): http : //sqlfiddle.com/#!4/7b53c/1
如果您想解析JSON文件,PL / JSON庫可以為您提供幫助。 PL / JSON網站
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.