【问题标题】:Oracle Delete more than one node in XMLTYPEoracle删除XMLTYPE中多个节点
【发布时间】:2016-02-25 15:31:50
【问题描述】:

我有一个 XMLTYPE 内容,我想删除该 XML 中的多个标签。

我正在使用 XMLQUERY 删除 recordType 中的标签 Header,如下所示:

   SELECT XMLQUERY (
             'copy $i := $p modify
                  delete nodes $i//Header/recordType
                return $i'
             PASSING pv_header AS "p" RETURNING CONTENT)
     INTO result
     FROM DUAL;

如果我想删除多个标签而不使用 XMLQUERY 创建新的 SELECT 语句怎么办。我不能这样做:

SELECT XMLQUERY (
                 'copy $i := $p modify
                      delete nodes $i//Header/recordType
                      delete nodes $i//Header/interfaceType
                    return $i'
                 PASSING pv_header AS "p" RETURNING CONTENT)
         INTO result
         FROM DUAL;

注意:我可以使用 deleteXML,但它在 Oracle 12c 中被声明为已弃用的函数。

提前致谢! 菲利普

编辑:我将其用作参考:https://docs.oracle.com/database/121/ADXDB/xdb04cre.htm#ADXDB6086

【问题讨论】:

    标签: oracle plsql xmltype


    【解决方案1】:

    您可以对delete nodes 进行一系列调用,用括号括起来进行分组,并用逗号分隔以进行序列连接:

    WITH t (pv_header) AS (
      SELECT xmltype('<Header><recordType/><interfaceType/><other/></Header>')
      FROM dual
    )
    SELECT XMLQUERY (
      'copy $i := $p modify
        (delete nodes $i//Header/recordType,
          delete nodes $i//Header/interfaceType)
        return $i'
      PASSING pv_header AS "p" RETURNING CONTENT)
    FROM t;
    
    XMLQUERY('COPY$I:=$PMODIFY(DELETENODES$I//HEADER/RECORDTYPE,DELETENODES$I//HEADE
    --------------------------------------------------------------------------------
    <Header><other/></Header>
    

    【讨论】:

    • 谢谢!快速简单。我试过添加逗号,但没有用括号分组。
    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 2019-08-23
    相关资源
    最近更新 更多