[英]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.