使用 PLSQL 从 XML 输入中获取特定信息
Get specific information from XML input using PLSQL
输入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标签中没有[=的line_id 46=]
所以我需要以下信息
所以我需要以下信息
输出-
服务热线 -- 1111
Product_id -- 56789
服务热线 -- 3333
Product_id -23456
Product_id - 999999
服务热线 -- 5555
Product_id -666666
Product_id - 121212`
甲骨文版本:
PLSQL 版本 11.2.0.3.0 - 生产
你看过函数extractvalue了吗?它必须在查询的 select 子句中使用,但您可以通过 selecting from dual.
轻松解决该问题
select extractvalue(xml, '/major/minor/service_Line/line_id') into v_value from dual;
请注意输入XML必须是XML类型。您可以使用函数 xmltype(String).
将字符串转换为 XMLtype
Link 到 Oracle 的 extractvalue 文档:http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions054.htm#SQLRF06173
这不会解决您的全部问题,但我希望它能为您指明正确的方向。
类似的内容可能会对您有所帮助:
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
输入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标签中没有[=的line_id 46=]
所以我需要以下信息
所以我需要以下信息
输出-
服务热线 -- 1111
Product_id -- 56789
服务热线 -- 3333
Product_id -23456
Product_id - 999999
服务热线 -- 5555
Product_id -666666
Product_id - 121212`
甲骨文版本: PLSQL 版本 11.2.0.3.0 - 生产
你看过函数extractvalue了吗?它必须在查询的 select 子句中使用,但您可以通过 selecting from dual.
轻松解决该问题select extractvalue(xml, '/major/minor/service_Line/line_id') into v_value from dual;
请注意输入XML必须是XML类型。您可以使用函数 xmltype(String).
将字符串转换为 XMLtypeLink 到 Oracle 的 extractvalue 文档:http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions054.htm#SQLRF06173
这不会解决您的全部问题,但我希望它能为您指明正确的方向。
类似的内容可能会对您有所帮助:
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