查询xml类型列以提取值Oracle数据库

时间:2017-09-15 00:03:56

标签: xml oracle

<input xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" user="ABC" userid="xyz123" xmlns="urn:www.google.com/testsystem">
  <ProcessData>      
    <reviewYear>2014-2015</reviewYear>
  </ProcessData>
</input>

我在xmltype列中有上面的示例数据,提取userid或user值的值的sql查询是什么。我尝试了几种使用/ input和namespace的方法,没有返回任何值,谢谢。

2 个答案:

答案 0 :(得分:0)

您需要包含默认命名空间。您可以告诉这是默认值,因为没有名称空间前缀。

WITH test_data AS (
    SELECT
        xmltype('<input xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" user="ABC" userid="xyz123" xmlns="urn:www.google.com/testsystem">
  <ProcessData>      
    <reviewYear>2014-2015</reviewYear>
  </ProcessData>
</input>'
) xml_col
    FROM
        dual
) SELECT
    extractvalue(
        xml_col,
        '/input/@user',
        'xmlns="urn:www.google.com/testsystem"'
    ) user_val,
    extractvalue(
        xml_col,
        '/input/@userid',
        'xmlns="urn:www.google.com/testsystem"'
    ) userid_val
FROM
    test_data

答案 1 :(得分:0)

以下是使用XMLTABLE()函数提取属性的方法。请注意USER作为列名的候选者,因为user是Oracle中的保留字。您最好使用不同的列名称,可能是USR,如下所示:

select x.usr, x.userid
from   test_data td,
       xmltable('/'
                passing td.xml_str
                columns
                  usr    varchar2(100) path '@user',
                  userid varchar2(80)  path '@userid'
               ) x
;

其中test_data是包含XML列xml_str的表的名称(使用您的实际表名和列名,或将字符串传递给XMLTABLE()的任何机制。)