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

问题描述 投票:0回答:1

我正在寻找可以在具有存储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
sql oracle xpath plsql xmltype
1个回答
0
投票

将包含动态路径的表与包含XML的表合并,然后使用XMLTABLE提取值:

Oracle设置

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;

查询

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

输出

ID |路径|值-:| :----------------------------- | :----1 | / report / fulcriteria | 1个1 | / report / conumb | 21 | / report / dup | 31 | / report / reportdup [1] / dupsource | 4.11 | / report / reportdup [2] / dupsource | 4.2a1 | / report / reportdup [2] / dupnumb | 4.2b1 | / report / reportdup [3] / dupsource | 4.3a1 | / report / reportdup [3] / dupnumb | 4.3b1 | / report / final / dup | 5

db <>小提琴here

© www.soinside.com 2019 - 2024. All rights reserved.