Oracle 如何使用PL/SQL过滤XML字符串

Oracle 如何使用PL/SQL过滤XML字符串,oracle,plsql,Oracle,Plsql,我是PL/SQL编程新手,我正在尝试编写我的第一个程序 在Oracle数据库中,我有一个名为“ngg_basiscomponent”的表,其中有一个名为“data”的列,其中包含一些XML字符串。下面是一个记录示例: <kenm> <weergv> <tekst aardVp="LO" hgtCe="2500" tekst="27"> <ripunt x="109007204" y="505639703"/

我是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字符串中删除部分,直到

我通过使用以下查询成功地做到了这一点:

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实现相同的结果

这就是你需要的。请参阅下面的演示:

--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>
这就是你需要的。请参阅下面的演示:

--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>

可能是这样的:

CREATE TABLE XML_DATA (x XMLTYPE);
INSERT INTO XML_DATA VALUES (XMLTYPE('<kenm>
    <weergv>
        <tekst aardVp="LO" hgtCe="2500" tekst="27">
            <ripunt x="109007204" y="505639703"/>
        </tekst>
    </weergv>
    <codes>
        <code wrd="LKI|TYPE.HS"/>
        <code wrd="LKI|GROOTTE.-"/>
        <code wrd="LKI|SCHAAL.-"/>
    </codes>
</kenm>'));

UPDATE XML_DATA SET x = 
XMLQUERY('copy $kenm := . modify delete node $kenm//codes return $kenm' 
PASSING x
RETURNING CONTENT);

SELECT t.x.getclobval() FROM XML_DATA t;

<kenm>
  <weergv>
    <tekst aardVp="LO" hgtCe="2500" tekst="27">
      <ripunt x="109007204" y="505639703"/>
    </tekst>
  </weergv>
</kenm>
注意,XMLTYPE'。。。 ...'
不工作,我得到一个错误LPX-00234:未声明名称空间前缀gdm。可能有几种方法可以解决这个问题。

可能是这样的:

CREATE TABLE XML_DATA (x XMLTYPE);
INSERT INTO XML_DATA VALUES (XMLTYPE('<kenm>
    <weergv>
        <tekst aardVp="LO" hgtCe="2500" tekst="27">
            <ripunt x="109007204" y="505639703"/>
        </tekst>
    </weergv>
    <codes>
        <code wrd="LKI|TYPE.HS"/>
        <code wrd="LKI|GROOTTE.-"/>
        <code wrd="LKI|SCHAAL.-"/>
    </codes>
</kenm>'));

UPDATE XML_DATA SET x = 
XMLQUERY('copy $kenm := . modify delete node $kenm//codes return $kenm' 
PASSING x
RETURNING CONTENT);

SELECT t.x.getclobval() FROM XML_DATA t;

<kenm>
  <weergv>
    <tekst aardVp="LO" hgtCe="2500" tekst="27">
      <ripunt x="109007204" y="505639703"/>
    </tekst>
  </weergv>
</kenm>
注意,XMLTYPE'。。。 ...'
不工作,我得到一个错误LPX-00234:未声明名称空间前缀gdm。可能有几种方法可以解决此问题。

可能或可以使此easierXMLPATCH只删除节点中的数据而不删除节点,可能或可以使此easierXMLPATCH只删除节点中的数据而不删除节点,遗憾的是,DELETEXML已被弃用——DELETEXML的语法比XQuery更简单expression@WernfriedDomscheit谢谢你的回复,但是你能分享一下它提到的地方吗deprecated@XING-在文档中,它被标记为不推荐使用。这就是为什么使用XML如此痛苦的原因。语法一开始就很复杂,但在每一个主要版本中,似乎所有的东西都被弃用了,并没有明确的原因被更复杂的东西所取代。我觉得这是一个操作。遗憾的是,DELETEXML被弃用了——DELETEXML的语法比XQuery更简单expression@WernfriedDomscheit谢谢你的回复,但是你能分享一下它提到的地方吗deprecated@XING-在文档中,它被标记为不推荐使用。这就是为什么使用XML如此痛苦的原因。语法一开始就很复杂,但在每一个主要版本中,似乎所有的东西都被弃用了,并没有明确的原因被更复杂的东西所取代。我赞成手术。