使用PLSQL从XML输入中获取特定信息

时间:2015-03-13 04:52:35

标签: xml oracle plsql plsqldeveloper

输入XML

<major>
    <minor>
        <line_id>12345</line_id>
        <service_Line>
            <line_id>1111</line_id>
            <product_id>56789</product_id>
        </service_Line>
        <service_Line>
            <line_id>22222</line_id>
        </service_Line>
        <service_Line>
            <line_id>3333</line_id>
            <product_id>23456</product_id>
            <product_id>999999</product_id>
        </service_Line>
        <service_Line>
            <line_id>4444</line_id>
        </service_Line>
    </minor>
    <service_Line>
        <line_id>5555</line_id>
        <product_id>666666</product_id>
        <product_id>121212</product_id>
    </service_Line>
    <service_Line>
        <line_id>5555</line_id>
    </service_Line>
</major>

来自上面的XML

我想要service_line标记的line_id和Product_id,并忽略service_line标记中没有product_id的line_id

所以我需要以下信息

所以我需要以下信息

Out put -

Service LIne - 1111

 Product_id -- 56789

服务热线 - 3333

 Product_id -23456
 Product_id - 999999

服务热线 - 5555

   Product_id -666666
   Product_id - 121212`

Oracle版本: PLSQL版本11.2.0.3.0 - 生产

2 个答案:

答案 0 :(得分:0)

你看过函数extractvalue了吗?它必须在查询的select子句中使用,但您可以通过从dual中选择来轻松解决这个问题。

select extractvalue(xml, '/major/minor/service_Line/line_id') into v_value from dual;

请注意,输入XML必须是XMLtype类型。您可以使用函数xmltype(String)将字符串转换为XMLtype。

链接到Oracle的extractvalue文档:http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions054.htm#SQLRF06173

这不会解决你的整个问题,但我希望它会指出你正确的方向。

答案 1 :(得分:0)

这样的事可能会对你有所帮助:

WITH xml_table AS (SELECT XMLTYPE(
'<major>
    <minor>
    <line_id>12345</line_id>
    <service_Line>
        <line_id>1111</line_id>
        <product_id>56789</product_id>
    </service_Line>
    <service_Line>
        <line_id>22222</line_id>
    </service_Line>
    <service_Line>
        <line_id>3333</line_id>
        <product_id>23456</product_id>
        <product_id>999999</product_id>
    </service_Line>
    <service_Line>
        <line_id>4444</line_id>
    </service_Line>
</minor>
<service_Line>
    <line_id>5555</line_id>
    <product_id>666666</product_id>
    <product_id>121212</product_id>
</service_Line>
<service_Line>
    <line_id>5555</line_id>
</service_Line>
</major>') xml FROM DUAL)
SELECT EXTRACTVALUE(VALUE(SERVICE_LINE),'/line_id') line_id,  EXTRACTVALUE(VALUE(SERVICE_LINE),'/product_id') product_id
FROM xml_table, TABLE(XMLSEQUENCE(EXTRACT(xml_table.xml,'//service_Line/*'))) service_line