从Oracle中具有多个同名标记的Clob列中提取XML标记值

从Oracle中具有多个同名标记的Clob列中提取XML标记值,xml,oracle,plsql,Xml,Oracle,Plsql,这是我的clob数据 <id>ID001</id> <atrbtList> <Atrbts> <atrTyp>1</atrTyp> <atrVal>04120101254</atrVal> </Atrbts> <Atrbts> <atrTyp>2</atrTyp> &

这是我的clob数据

<id>ID001</id>
<atrbtList>
    <Atrbts>
        <atrTyp>1</atrTyp>
        <atrVal>04120101254</atrVal>
    </Atrbts>
    <Atrbts>
        <atrTyp>2</atrTyp>
        <atrVal>1254</atrVal>
    </Atrbts>
</atrbtList>
目前我正在使用oracle xml extract函数,这是我在查询中所做的工作

    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
有没有人能给我指出正确的方向来获得所需的结果,我也觉得查询的质量可以提高,或者有更好的方法来实现这一点,这是我所缺少的

附言: 表及其内容

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>'
);
创建表名(xml\u clob clob);
在表中插入名称值(
“ID00110412010125421254”
);

您正在进行交叉连接2x2=4。您应该将atrbtList作为表(ATRBT序列)获取:


您正在进行交叉连接2x2=4。您应该将atrbtList作为表(ATRBT序列)获取:

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>'
);
 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