我正在寻找可以在具有存储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
提取值:
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