首页 > 解决方案 > 如何使用 PL/SQL 过滤 XML 字符串

问题描述

我是 PL/SQL 编程的新手,我正在尝试编写我的第一个程序。

在 Oracle 数据库中,我有一个名为“ngg_basiscomponent”的表,其中包含一个名为“data”的列,其中包含一些 XML 字符串。这里是一个记录的例子:

<kenm>
    <weergv>
        <tekst aardVp="LO" hgtCe="2500" tekst="27">
            <ripunt x="109007204" y="505639703"/>
        </tekst>
    </weergv>
    <gdm:codes>
        <gdm:code wrd="LKI|TYPE.HS"/>
        <gdm:code wrd="LKI|GROOTTE.-"/>
        <gdm:code wrd="LKI|SCHAAL.-"/>
    </gdm:codes>
</kenm>

我想从这些 XML 字符串中删除<gdm:codes>until中的部分</gdm:codes>

我设法通过使用以下查询来做到这一点:

update ngg_basiscomponent 
set data = substr(data, 1, instr(data, regexp_substr(data, '<gdm:codes>.+</gdm:codes>'))-1) 
   || substr(data, instr(data, regexp_substr(data, '<gdm:codes>.+</gdm:codes>'))
     + length(regexp_substr(data, '<gdm:codes>.+</gdm:codes>')))
 where regexp_substr(data, '<gdm:codes>.+</gdm:codes>') is not null;

这行得通,但这是实现这一目标的一种丑陋的方式。如果我可以定义一个变量来存储以下部分,那就太好了:

regexp_substr(data, '<gdm:codes>.+</gdm:codes>')

它定义了必须删除的部分。我试图通过使用一些 PL/SQL 代码来弄清楚如何做到这一点。如何使用 PL/SQL 获得相同的结果?

标签: oracleplsql

解决方案


DELETEXML 是您需要的。请看下面的演示:

--Created table
create table tb as
  SELECT
                    xmltype('<?xml version="1.0"?>
                   <kenm>
                    <weergv>
                        <tekst aardVp="LO" hgtCe="2500" tekst="27">
                            <ripunt x="109007204" y="505639703"/>
                        </tekst>
                    </weergv>
                       <gdm>
                        <gdm wrd="LKI|TYPE.HS"/>
                        <gdm wrd="LKI|GROOTTE.-"/>
                        <gdm wrd="LKI|SCHAAL.-"/>
                    </gdm>    
                    </kenm>') col                        
                FROM     dual

-----------
--Selecting

Select * from tb;

--Output:

<?xml version="1.0"?>
                   <kenm>
                    <weergv>
                        <tekst aardVp="LO" hgtCe="2500" tekst="27">
                            <ripunt x="109007204" y="505639703"/>
                        </tekst>
                    </weergv>
                       <gdm>
                        <gdm wrd="LKI|TYPE.HS"/>
                        <gdm wrd="LKI|GROOTTE.-"/>
                        <gdm wrd="LKI|SCHAAL.-"/>
                    </gdm>    
                    </kenm>

----------
--Deleting

Update tb set col = DELETEXML(col,'/kenm/gdm');

---------

Select * from tb;

Output:

<?xml version="1.0"?>
<kenm>
  <weergv>
    <tekst aardVp="LO" hgtCe="2500" tekst="27">
      <ripunt x="109007204" y="505639703"/>
    </tekst>
  </weergv>
</kenm>

推荐阅读