从XML到Oracle PL/SQL环境中的路径列表

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安装.

Thi*_*Jet 5

您可以使用XMLTableXQuery生成路径列表.

例如

(SQLFiddle)

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)