从 Clob 列中提取 XML 标记值,在 Oracle 中具有多个具有相同名称的标记
Posted
技术标签:
【中文标题】从 Clob 列中提取 XML 标记值,在 Oracle 中具有多个具有相同名称的标记【英文标题】:XML Tag Value Extract from Clob column with Multiple Tags with Same Name in Oracle 【发布时间】:2016-07-04 10:15:05 【问题描述】:这是我的 clob 数据
<id>ID001</id>
<atrbtList>
<Atrbts>
<atrTyp>1</atrTyp>
<atrVal>04120101254</atrVal>
</Atrbts>
<Atrbts>
<atrTyp>2</atrTyp>
<atrVal>1254</atrVal>
</Atrbts>
</atrbtList>
在表格中。
我需要以
的形式提取数据ID |Type |Value
------------------
ID001 | 1 |04120101254
ID001 | 2 |1254
目前我正在使用 oracle xml 提取功能,这是我已经完成的查询
SELECT
XMLTYPE(xml_clob).extract('//id/text()').getStringVal() AS Id,
EXTRACTVALUE( s1.COLUMN_VALUE, '//atrTyp' ) AS AtrTyp,
EXTRACTVALUE( s.COLUMN_VALUE, '//atrVal' ) AS AtrVal
FROM table_name T,
TABLE(
XMLSequence(
EXTRACT(
XMLType( T.xml_clob ),
'//atrVal'
)
)
) s,
TABLE(
XMLSequence(
EXTRACT(
XMLType( T.xml_clob ),
'//atrTyp'
)
)
) s1
这会产生结果集
ID |Type |Value
------------------
ID001 1 04120101254
ID001 2 04120101254
ID001 1 1254
ID001 2 1254
谁能指出我正确的方向以获得所需的结果,我也觉得查询可以改进,或者有更好的方法来做到这一点,我错过了。
PS: 表格及其内容
CREATE TABLE table_name (xml_clob CLOB );
INSERT INTO table_name VALUES (
'<data><id>ID001</id><atrbtList><Atrbts><atrTyp>1</atrTyp><atrVal>04120101254</atrVal></Atrbts><Atrbts><atrTyp>2</atrTyp><atrVal>1254</atrVal></Atrbts></atrbtList></data>'
);
【问题讨论】:
【参考方案1】:您正在进行交叉连接 2x2 = 4。您应该将 atrbtList 作为表(Atrbts 序列):
SELECT XMLTYPE(xml_clob).extract('//id/text()').getStringVal() AS Id,
EXTRACTVALUE( s.COLUMN_VALUE, '/Atrbts/atrTyp' ) AS AtrTyp,
EXTRACTVALUE( s.COLUMN_VALUE, '/Atrbts/atrVal' ) AS AtrVal
FROM table_name T,
TABLE(
XMLSequence(
EXTRACT(
XMLType( T.xml_clob ),
'/data/atrbtList/*'
)
)
) s
【讨论】:
以上是关于从 Clob 列中提取 XML 标记值,在 Oracle 中具有多个具有相同名称的标记的主要内容,如果未能解决你的问题,请参考以下文章