输入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 - 生产
答案 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