XML Oracle : Multiple Child Node extract(XML Oracle:多子节点提取)
问题描述
我有一个 xml 代码:
I have an xml code :
<begin>
<entry>
<lastname>gordon</lastname>
<NumberList>
<number>100</number>
<codelist>
<code>213</code>
<code>214</code>
<codelist>
<login>
<user>user1</user>
<user>user2</user>
</login>
<NumberList>
<address>
<addresslist>Jl. jalan pelan-pelan ke Bekasi, Indonesia</addresslist>
</address>
</entry>
<entry>
<lastname>mark</lastname>
<address>
<addresslist>Jl. jalan cepet-cepet ke Jakarta, Indonesia</addresslist>
</address>
</entry>
</begin>
我的代码:
FOR r IN (SELECT VALUE(p) col_val,
EXTRACT(VALUE(P), '/entry/codelist') AS code,
EXTRACT(VALUE(P), '/entry/login') AS login
FROM TABLE(XMLSequence(Extract(x,'/begin/entry'))) p)
LOOP
IF r.col_val.existsnode('/entry/lastname/text()') > 0
THEN
vc_lastname := r.col_val.extract('/sdnEntry/lastname/text()').getstringval();
END IF;
IF r.col_val.existsnode('/entry/address/addresslist/text()') > 0
THEN
vc_address := r.col_val.extract('/sdnEntry/address/addresslist/text()').getstringval();
END IF;
IF r.col_val.existsnode('/entry/codelist/id/code/text()') > 0 AND r.col_val.existsnode('/entry/login/user/text()') > 0
THEN
FOR R1 IN (SELECT EXTRACTVALUE(VALUE(T1), '/codelist/code/text()') AS code
FROM TABLE(XMLSEQUENCE(EXTRACT(R.code, '/codelist'))) T1)
LOOP
DBMS_OUTPUT.PUT_LINE(vc_uid||' - '||vc_firstName||' - '||R1.code||' - '||R2.address);
END LOOP;
FOR R2 IN (SELECT
EXTRACTVALUE(VALUE(T1), '/login/user/text()') AS user
FROM TABLE(XMLSEQUENCE(EXTRACT(R.address, 'login/'))) T1)
LOOP
DBMS_OUTPUT.PUT_LINE(vc_uid||' - '||vc_firstName||' - '||R2.user||' - '||R2.address);
END LOOP;
ELSE
DBMS_OUTPUT.PUT_LINE(vc_uid||' - '||vc_firstName);
END IF;
我的问题:如何循环子节点使数据变成这样:
My problem : How to loop child nodes so the data will become like this :
LastName | Number | code | user | address
gordon | 100 | 213 | user1 |Jl. jalan pelan-pelan ke Bekasi, Indonesia
gordon | 100 | 213 | user2 |Jl. jalan pelan-pelan ke Bekasi, Indonesia
gordon | 100 | 214 | user1 |Jl. jalan pelan-pelan ke Bekasi, Indonesia
gordon | 100 | 214 | user2 |Jl. jalan pelan-pelan ke Bekasi, Indonesia
mark | Null | null | null |Jl. jalan cepet-cepet ke Jakarta, Indonesia
任何帮助将不胜感激.
推荐答案
你可以使用 XMLTable() 函数来达到预期的效果:
You can achieve desired result by using XMLTable() function:
select q.Lastname
, q.Numberid
, s.codeid
, w.LoginId
, q.address
from t1 t
left join xmltable('/begin/entry'
passing t.xml_col
columns LastName varchar2(21) path 'lastname',
NumberId number path 'NumberList/number',
Address varchar2(201) path 'address/addresslist',
CodeList XmlType Path 'NumberList/codelist/code',
Logins XmlType Path 'NumberList/login/user'
) q
on (1=1)
left join xmltable('/code'
passing q.CodeList
columns CodeId number path '.') s
on (1=1)
left join xmltable('/user'
passing q.Logins
columns LoginId varchar2(11) path '.') w
on (1=1)
结果:SQLFiddle 演示
Lastname Numberid Codeid Loginid Address
---------------------------------------------------------------------------
gordon 100 213 user1 Jl. jalan pelan-pelan ke Bekasi, Indonesia
gordon 100 213 user2 Jl. jalan pelan-pelan ke Bekasi, Indonesia
gordon 100 214 user1 Jl. jalan pelan-pelan ke Bekasi, Indonesia
gordon 100 214 user2 Jl. jalan pelan-pelan ke Bekasi, Indonesia
mark null null null Jl. jalan cepet-cepet ke Jakarta, Indonesia
了解更多关于XMLTable() 函数.
注意:使用 11.2.0.2 之前的 Oracle 版本,当 cursor_sharing 参数设置为 FORCE 或 SIMILAR(从 11.2 开始弃用).将cursor_sharing参数设置为EXACT(默认值),即可解决问题.
Note: Working with Oracle releases prior to 11.2.0.2, you can encounter ORA-1780 error(bug 8545377) on certain types of XML queries when cursor_sharing parameter is set to FORCE or SIMILAR(deprecated starting from 11.2). Setting cursor_sharing parameter to EXACT(default value), will solve the problem.
这篇关于XML Oracle:多子节点提取的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:XML Oracle:多子节点提取
基础教程推荐
- 如何在 CakePHP 3 中实现 INSERT ON DUPLICATE KEY UPDATE aka upsert? 2021-01-01
- MySQL 5.7参照时间戳生成日期列 2022-01-01
- 带更新的 sqlite CTE 2022-01-01
- ORA-01830:日期格式图片在转换整个输入字符串之前结束/选择日期查询的总和 2021-01-01
- 从字符串 TSQL 中获取数字 2021-01-01
- CHECKSUM 和 CHECKSUM_AGG:算法是什么? 2021-01-01
- 使用 VBS 和注册表来确定安装了哪个版本和 32 位 2021-01-01
- while 在触发器内循环以遍历 sql 中表的所有列 2022-01-01
- 带有WHERE子句的LAG()函数 2022-01-01
- MySQL根据从其他列分组的值,对两列之间的值进行求和 2022-01-01
