【问题标题】:From XML to list of paths in Oracle PL/SQL environment从 XML 到 Oracle PL/SQL 环境中的路径列表
【发布时间】:2013-08-11 09:23:47
【问题描述】:

请假设您有一个 XML 文件(例如,存储在一个具有 CLOB 列的 Oracle 表中):

<ALFA>
  <BETA>0123</BETA>
  <GAMMA>2345</GAMMA>
  <DELTA>
     <EPSILON>3</EPSILON>
  </DELTA>
</ALFA>

如何在输出中生成所有可能路径的列表?

/ALFA/BETA/text()
/ALFA/GAMMA/text()
/ALFA/DELTA/EPSILON/text()

我的需求如下:我必须从长 XML 中提取许多信息,并且必须将 XMLEXTRACT 与所有可能的路径一起使用,所以我想知道是否可以自动“dbms_output.put_line”它们方式。

我需要一个独立于标签名称的解决方案。

请假设 XML 格式正确。

提前感谢您的热心帮助。


  • 二审:

如果没有安装 Oracle Java 扩展,我该如何继续,并且收到以下错误?

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

请假设我不是 DBA,并且 DBA 不授权安装 Oracle Java Extension。

【问题讨论】:

    标签: xml oracle plsql xmltype


    【解决方案1】:

    您可以使用XMLTable 通过 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
      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'
      )
    

    但至少这是一种错误的方式,因为它没有尽可能有效。

    只需使用相同的 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'
      )
    

    【讨论】:

    • 天哪,它起作用了,你太棒了!! :-) 永远接受的解决方案! :-) 起立鼓掌!!! :-)
    猜你喜欢
    • 2018-08-08
    • 2015-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多