![](/img/trans.png)
[英]Retrieving oracle XMLType stored as binary XML from a resultset in Java
[英]Retrieving XML elements from XMLType Oracle
有人可以幫我從Oracle的XMLType列中檢索數據嗎?
drop table xml_analysis;
create table xml_analysis(id number,soft_attributes XMLType);
create table xml_softattributes(id number,soft_attributes varchar2(200));
INSERT INTO xml_analysis VALUES
( 1, XMLType(
'<softattributes>
<attr1>ABC</attr1>
<attr2>XYZ</attr2>
<attr3>PQR</attr3>
</softattributes>
'));
insert into xml_softattributes values(1,'attr1');
insert into xml_softattributes values(1,'attr2');
insert into xml_softattributes values(1,'attr3');
現在我的問題是使用表xml_softattributes從xml_analysis表動態檢索數據,我該怎么做?
需要輸出
Softattribute Value
=======================
attr1 ABC
attr2 XYZ
attr3 PQR
我能想到的可能解決方案是使用動態字符串並執行,但是我不希望使用動態字符串查詢來檢索數據。
您可以按以下方式結合使用existsNode
和extract
函數。
SELECT b.SOFT_ATTRIBUTES,
CASE
WHEN existsNode (a.soft_attributes ,'/*/'
||b.SOFT_ATTRIBUTES) = 1
THEN a.soft_attributes.extract('/*/'
||b.SOFT_ATTRIBUTES
||'/text()').getStringVal()
END value
FROM xml_analysis a,
xml_softattributes b
WHERE a.id = b.id;
*
用作通配符以匹配任何子節點。 例如,/ PO / * / STREET匹配作為PO元素的孫代的任何street元素。
輸出:
attr1 ABC
attr2 XYZ
attr3 PQR
如果屬性集是固定的( 'attr1', 'attr2', 'attr3'
),則可以從XML結構中提取數據,然后取消透視。 然后,您可以按常規方式連接到另一個表。
select id, softattribute, value
from (
select x.id, xt.attr1, xt.attr2, xt.attr3
from xml_analysis x,
xmltable('/softattributes'
passing x.soft_attributes
columns
attr1 varchar2(100) path 'attr1',
attr2 varchar2(100) path 'attr2',
attr3 varchar2(100) path 'attr3'
) xt
)
unpivot ( value
for softattribute in (attr1 as 'attr1', attr2 as 'attr2', attr3 as 'attr3')
)
;
ID SOFTATTRIBUTE VALUE
-- ------------- -----
1 attr1 ABC
1 attr2 XYZ
1 attr3 PQR
如果只有通過檢查數據才能知道屬性集,那么UNPIVOT
將不起作用XMLTABLE
也將不起作用,因為PATH
必須是字符串文字,在編寫代碼時就知道(或動態查詢編寫過程),則無法在運行時學習。
如果這是一個問題,您可能需要重新考慮XML結構; 'attr1'
等應該是值,而不是標簽,就像值一樣。 (如果要在EAV模型中工作,請朝那個方向進行。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.