繁体   English   中英

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

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

我正在寻找可以在具有存储 XML 的列之一的表上运行的 Oracle 查询。此查询应动态采用查询中的 xpath 以从所有节点中提取字符串。 我在下面尝试过,但我必须对 xpath 进行硬编码。 我不想对 xpath 进行硬编码。

有没有一种方法可以根据 XML 的结构(结构可能会有所不同)动态生成 xpath 以提取 xml 节点值?

我需要的输出是 xml 节点的提取值。

我试过:

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

将包含动态路径的表与包含 XML 的表连接起来,然后使用XMLTABLE提取值:

甲骨文设置

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;

查询 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

查询 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;

查询 3

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

输出

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

db<> 在这里摆弄

暂无
暂无

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

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