从 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 中具有多个具有相同名称的标记的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle 的 CLOB 列中更新 xml 标记

从 CLOB 列中过滤非 XML 数据

如何在 PL/SQL 中使用 FOR LOOP 从具有相同标签的 xml clob 中提取值

从包含 XML 的 sql 列中提取值

在 Oracle 10g 上加载超过 64K 的 XML

ORA-00932: inconsistent datatypes: expected - got CLOB