Ult*_*mit 3 xml oracle plsql xmltype
请假设您有一个XML文件(例如,存储在Oracle表中,该表还有一个CLOB列):
<ALFA>
<BETA>0123</BETA>
<GAMMA>2345</GAMMA>
<DELTA>
<EPSILON>3</EPSILON>
</DELTA>
</ALFA>
Run Code Online (Sandbox Code Playgroud)
如何在输出中生成所有可能路径的列表?
/ALFA/BETA/text()
/ALFA/GAMMA/text()
/ALFA/DELTA/EPSILON/text()
Run Code Online (Sandbox Code Playgroud)
我需要以下内容:我必须从长XML中提取许多信息,并且我必须将XMLEXTRACT与所有可能的路径一起使用,所以我想知道是否可以以自动方式"dbms_output.put_line"它们.
我需要一个独立于标签名称的解决方案.
请假设XML格式正确.
提前感谢您的帮助.
如果尚未安装Oracle Java Extension,我该怎么办?我收到以下错误?
ORA-19112: error raised during evaluation:
ORA-06550: line 1, column 13:
PLS-00201: identifier 'SYS.DBMS_XQUERYINT' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
Run Code Online (Sandbox Code Playgroud)
请假设我不是DBA,DBA不授权Oracle Java Extension安装.
您可以使用XMLTableXQuery生成路径列表.
例如
with params as (
select
xmltype('
<ALFA>
<BETA>0123</BETA>
<GAMMA>2345</GAMMA>
<DELTA>
<EPSILON>3</EPSILON>
</DELTA>
</ALFA>
') p_xml
from dual
)
select
path_name || '/text()'
from
XMLTable(
'
for $i in $doc/descendant-or-self::*
return <element_path> {$i/string-join(ancestor-or-self::*/name(.), ''/'')} </element_path>
'
passing (select p_xml from params) as "doc"
columns path_name varchar2(4000) path '//element_path'
)
Run Code Online (Sandbox Code Playgroud)
但这是一种错误的方式,至少因为它没有效果.
只需使用相同的XQuery提取所有值:(SQLFiddle)
with params as (
select
xmltype('
<ALFA>
<BETA>0123</BETA>
<GAMMA>2345</GAMMA>
<DELTA>
<EPSILON>3</EPSILON>
</DELTA>
</ALFA>
') p_xml
from dual
)
select
element_path, element_text
from
XMLTable(
'
for $i in $doc/descendant-or-self::*
return <element>
<element_path> {$i/string-join(ancestor-or-self::*/name(.), ''/'')} </element_path>
<element_content> {$i/text()}</element_content>
</element>
'
passing (select p_xml from params) as "doc"
columns
element_path varchar2(4000) path '//element_path',
element_text varchar2(4000) path '//element_content'
)
Run Code Online (Sandbox Code Playgroud)