简体   繁体   English

Oracle 查询以动态地从表中提取 XML 元素值

[英]Oracle query to extract XML Element values from a table dynamically

I am looking for Oracle query which can be run on a table that has one of the column storing XML's This query should dynamically take the xpath in the query to extract the string from all nodes.我正在寻找可以在具有存储 XML 的列之一的表上运行的 Oracle 查询。此查询应动态采用查询中的 xpath 以从所有节点中提取字符串。 I have tried below but i have to hardcode the xpath.我在下面尝试过,但我必须对 xpath 进行硬编码。 I do not want to hardcode the xpath.我不想对 xpath 进行硬编码。

Is there a way to generate the xpath, based on the structure of XML(structure may vary) on the fly to extract the xml node value?有没有一种方法可以根据 XML 的结构(结构可能会有所不同)动态生成 xpath 以提取 xml 节点值?

Output i need is the extracted value of the xml node.我需要的输出是 xml 节点的提取值。

I tried:我试过:

SELECT xmltype(XMLCOLUMN).EXTRACT('/report/fulcriteria/text()'),
       xmltype(XMLCOLUMN).EXTRACT('/report/conumb/text()'),
       xmltype(XMLCOLUMN).EXTRACT('/report/dup/text()'),
       xmltype(XMLCOLUMN).EXTRACT('/report/reportdup[1]/dupsource/text()'),
       xmltype(XMLCOLUMN).EXTRACT('/report/reportdup[2]/dupsource/text()'),
       xmltype(XMLCOLUMN).EXTRACT('/report/reportdup[2]/dupnumb/text()'),
       xmltype(XMLCOLUMN).EXTRACT('/report/reportdup[3]/dupsource/text()'),
       xmltype(XMLCOLUMN).EXTRACT('/report/reportdup[3]/dupnumb/text()') . 
       xmltype(XMLCOLUMN).EXTRACT('/report/final/dup/text()'),
  FROM MYTABLE

Join the table containing your dynamic paths with the table containing the XML and then use XMLTABLE to extract the value:将包含动态路径的表与包含 XML 的表连接起来,然后使用XMLTABLE提取值:

Oracle Setup :甲骨文设置

CREATE TABLE mytable ( id, xmlcolumn ) AS
SELECT 1, '<report>
  <fulcriteria>1</fulcriteria>
  <conumb>2</conumb>
  <dup>3</dup>
  <reportdup><dupsource>4.1</dupsource></reportdup>
  <reportdup><dupsource>4.2a</dupsource><dupnumb>4.2b</dupnumb></reportdup>
  <reportdup><dupsource>4.3a</dupsource><dupnumb>4.3b</dupnumb></reportdup>
  <final><dup>5</dup></final>
</report>' FROM DUAL;

CREATE TABLE paths ( path ) AS
SELECT '/report/fulcriteria' FROM DUAL UNION ALL
SELECT '/report/conumb' FROM DUAL UNION ALL
SELECT '/report/dup' FROM DUAL UNION ALL
SELECT '/report/reportdup[1]/dupsource' FROM DUAL UNION ALL
SELECT '/report/reportdup[2]/dupsource' FROM DUAL UNION ALL
SELECT '/report/reportdup[2]/dupnumb' FROM DUAL UNION ALL
SELECT '/report/reportdup[3]/dupsource' FROM DUAL UNION ALL
SELECT '/report/reportdup[3]/dupnumb'  FROM DUAL UNION ALL
SELECT '/report/final/dup' FROM DUAL;

Query 1 :查询 1

SELECT t.id,
       p.path,
       x.value
FROM   MYTABLE t
       CROSS JOIN PATHS p
       CROSS JOIN XMLTABLE(
         p.path
         PASSING XMLTYPE( t.xmlcolumn )
         COLUMNS
           value VARCHAR2(4000) PATH '.'
       ) x

Query 2 :查询 2

SELECT t.id,
       p.path,
       XMLQUERY(
         (p.path || '/text()')
         PASSING XMLTYPE( t.xmlcolumn )
         RETURNING CONTENT
       ) AS value
FROM   MYTABLE t
       CROSS JOIN PATHS p;

Query 3 :查询 3

SELECT t.id,
       p.path,
       XMLTYPE( t.xmlcolumn ).EXTRACT(p.path||'/text()').getStringVal() AS value
FROM   MYTABLE t
       CROSS JOIN PATHS p;

Output :输出

\nID |身份证 | PATH |路径 | VALUE价值\n-: | -: | :----------------------------- | :----------------------------- | :---- :----\n 1 | 1 | /report/fulcriteria | /报告/fulcriteria | 1 1    \n 1 | 1 | /report/conumb | /报告/conumb | 2 2    \n 1 | 1 | /report/dup | /报告/复制| 3 3    \n 1 | 1 | /report/reportdup[1]/dupsource | /report/reportdup[1]/dupsource | 4.1 4.1  \n 1 | 1 | /report/reportdup[2]/dupsource | /report/reportdup[2]/dupsource | 4.2a 4.2a \n 1 | 1 | /report/reportdup[2]/dupnumb | /report/reportdup[2]/dupnumb | 4.2b 4.2b \n 1 | 1 | /report/reportdup[3]/dupsource | /report/reportdup[3]/dupsource | 4.3a 4.3a \n 1 | 1 | /report/reportdup[3]/dupnumb | /report/reportdup[3]/dupnumb | 4.3b 4.3b \n 1 | 1 | /report/final/dup | /report/final/dup | 5 5    \n

db<>fiddle here db<> 在这里摆弄

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM