在ORACLE 10G中将值更新为XML

在ORACLE 10G中将值更新为XML,oracle,Oracle,我在文件夹中有下面的XML,我想找到并替换一些值。怎么做 示例:无论UK0在哪里,我都希望使用更新查询替换UK1 <?xml version="1.0"?> <RSET> <ROW> <SDC_FNAME>JQ13868001.XML</SDC_FNAME> <SDC_RECORD>6</SDC_RECORD> <SDC_FROMDT>06/14/2017 08:13:58</SD

我在文件夹中有下面的XML,我想找到并替换一些值。怎么做

示例:无论UK0在哪里,我都希望使用更新查询替换UK1

<?xml version="1.0"?>
<RSET>
 <ROW>
  <SDC_FNAME>JQ13868001.XML</SDC_FNAME>
  <SDC_RECORD>6</SDC_RECORD>
  <SDC_FROMDT>06/14/2017 08:13:58</SDC_FROMDT>
  <SDC_TODT>06/16/2017 08:13:58</SDC_TODT>
  <SDC_TNAME>S_STYLE</SDC_TNAME>
  <SDC_FROM>AB</SDC_FROM>
  <SDC_TO>UK0</SDC_TO>
 </ROW>
 <ROW>
  <SDC_FNAME>JQ13868002.XML</SDC_FNAME>
  <SDC_RECORD>6</SDC_RECORD>
  <SDC_FROMDT>06/14/2017 08:13:58</SDC_FROMDT>
  <SDC_TODT>06/16/2017 08:13:58</SDC_TODT>
  <SDC_TNAME>S_STYLE</SDC_TNAME>
  <SDC_FROM>AB</SDC_FROM>
  <SDC_TO>UK0</SDC_TO>
 </ROW>
</RSET>
在10g中,您可以使用:

在11gR2中运行演示以使用xmlserialize的indent子句,只是为了使它更漂亮;updatexml部件在10gR2中工作:

select xmlserialize(content
  updatexml(xmltype('<?xml version="1.0"?>
<RSET>
 <ROW>
  <SDC_FNAME>JQ13868001.XML</SDC_FNAME>
  <SDC_RECORD>6</SDC_RECORD>
  <SDC_FROMDT>06/14/2017 08:13:58</SDC_FROMDT>
  <SDC_TODT>06/16/2017 08:13:58</SDC_TODT>
  <SDC_TNAME>S_STYLE</SDC_TNAME>
  <SDC_FROM>AB</SDC_FROM>
  <SDC_TO>UK0</SDC_TO>
 </ROW>
 <ROW>
  <SDC_FNAME>JQ13868002.XML</SDC_FNAME>
  <SDC_RECORD>6</SDC_RECORD>
  <SDC_FROMDT>06/14/2017 08:13:58</SDC_FROMDT>
  <SDC_TODT>06/16/2017 08:13:58</SDC_TODT>
  <SDC_TNAME>S_STYLE</SDC_TNAME>
  <SDC_FROM>AB</SDC_FROM>
  <SDC_TO>UK1</SDC_TO>
 </ROW>
</RSET>'), '/RSET/ROW/SDC_TO[text()="UK0"]/text()', 'UK1')
    indent) as result
from dual;

RESULT                                                                          
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<RSET>
  <ROW>
    <SDC_FNAME>JQ13868001.XML</SDC_FNAME>
    <SDC_RECORD>6</SDC_RECORD>
    <SDC_FROMDT>06/14/2017 08:13:58</SDC_FROMDT>
    <SDC_TODT>06/16/2017 08:13:58</SDC_TODT>
    <SDC_TNAME>S_STYLE</SDC_TNAME>
    <SDC_FROM>AB</SDC_FROM>
    <SDC_TO>UK1</SDC_TO>
  </ROW>
  <ROW>
    <SDC_FNAME>JQ13868002.XML</SDC_FNAME>
    <SDC_RECORD>6</SDC_RECORD>
    <SDC_FROMDT>06/14/2017 08:13:58</SDC_FROMDT>
    <SDC_TODT>06/16/2017 08:13:58</SDC_TODT>
    <SDC_TNAME>S_STYLE</SDC_TNAME>
    <SDC_FROM>AB</SDC_FROM>
    <SDC_TO>UK1</SDC_TO>
  </ROW>
</RSET>
但10gR2不支持这种语法

演示在11gR2下运行:

select xmlserialize(content xmlquery('
  copy $i := $p modify (
    for $j in $i/RSET/ROW/SDC_TO[text()="UK0"]
      return replace value of node $j with "UK1"
    )
    return $i'
  passing xmltype('<?xml version="1.0"?>
<RSET>
 <ROW>
  <SDC_FNAME>JQ13868001.XML</SDC_FNAME>
  <SDC_RECORD>6</SDC_RECORD>
  <SDC_FROMDT>06/14/2017 08:13:58</SDC_FROMDT>
  <SDC_TODT>06/16/2017 08:13:58</SDC_TODT>
  <SDC_TNAME>S_STYLE</SDC_TNAME>
  <SDC_FROM>AB</SDC_FROM>
  <SDC_TO>UK0</SDC_TO>
 </ROW>
 <ROW>
  <SDC_FNAME>JQ13868002.XML</SDC_FNAME>
  <SDC_RECORD>6</SDC_RECORD>
  <SDC_FROMDT>06/14/2017 08:13:58</SDC_FROMDT>
  <SDC_TODT>06/16/2017 08:13:58</SDC_TODT>
  <SDC_TNAME>S_STYLE</SDC_TNAME>
  <SDC_FROM>AB</SDC_FROM>
  <SDC_TO>UK1</SDC_TO>
 </ROW>
</RSET>') AS "p"
  returning content) indent) as result
from dual;

RESULT                                                                          
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<RSET>
  <ROW>
    <SDC_FNAME>JQ13868001.XML</SDC_FNAME>
    <SDC_RECORD>6</SDC_RECORD>
    <SDC_FROMDT>06/14/2017 08:13:58</SDC_FROMDT>
    <SDC_TODT>06/16/2017 08:13:58</SDC_TODT>
    <SDC_TNAME>S_STYLE</SDC_TNAME>
    <SDC_FROM>AB</SDC_FROM>
    <SDC_TO>UK1</SDC_TO>
  </ROW>
  <ROW>
    <SDC_FNAME>JQ13868002.XML</SDC_FNAME>
    <SDC_RECORD>6</SDC_RECORD>
    <SDC_FROMDT>06/14/2017 08:13:58</SDC_FROMDT>
    <SDC_TODT>06/16/2017 08:13:58</SDC_TODT>
    <SDC_TNAME>S_STYLE</SDC_TNAME>
    <SDC_FROM>AB</SDC_FROM>
    <SDC_TO>UK1</SDC_TO>
  </ROW>
</RSET>
在10g中,您可以使用:

在11gR2中运行演示以使用xmlserialize的indent子句,只是为了使它更漂亮;updatexml部件在10gR2中工作:

select xmlserialize(content
  updatexml(xmltype('<?xml version="1.0"?>
<RSET>
 <ROW>
  <SDC_FNAME>JQ13868001.XML</SDC_FNAME>
  <SDC_RECORD>6</SDC_RECORD>
  <SDC_FROMDT>06/14/2017 08:13:58</SDC_FROMDT>
  <SDC_TODT>06/16/2017 08:13:58</SDC_TODT>
  <SDC_TNAME>S_STYLE</SDC_TNAME>
  <SDC_FROM>AB</SDC_FROM>
  <SDC_TO>UK0</SDC_TO>
 </ROW>
 <ROW>
  <SDC_FNAME>JQ13868002.XML</SDC_FNAME>
  <SDC_RECORD>6</SDC_RECORD>
  <SDC_FROMDT>06/14/2017 08:13:58</SDC_FROMDT>
  <SDC_TODT>06/16/2017 08:13:58</SDC_TODT>
  <SDC_TNAME>S_STYLE</SDC_TNAME>
  <SDC_FROM>AB</SDC_FROM>
  <SDC_TO>UK1</SDC_TO>
 </ROW>
</RSET>'), '/RSET/ROW/SDC_TO[text()="UK0"]/text()', 'UK1')
    indent) as result
from dual;

RESULT                                                                          
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<RSET>
  <ROW>
    <SDC_FNAME>JQ13868001.XML</SDC_FNAME>
    <SDC_RECORD>6</SDC_RECORD>
    <SDC_FROMDT>06/14/2017 08:13:58</SDC_FROMDT>
    <SDC_TODT>06/16/2017 08:13:58</SDC_TODT>
    <SDC_TNAME>S_STYLE</SDC_TNAME>
    <SDC_FROM>AB</SDC_FROM>
    <SDC_TO>UK1</SDC_TO>
  </ROW>
  <ROW>
    <SDC_FNAME>JQ13868002.XML</SDC_FNAME>
    <SDC_RECORD>6</SDC_RECORD>
    <SDC_FROMDT>06/14/2017 08:13:58</SDC_FROMDT>
    <SDC_TODT>06/16/2017 08:13:58</SDC_TODT>
    <SDC_TNAME>S_STYLE</SDC_TNAME>
    <SDC_FROM>AB</SDC_FROM>
    <SDC_TO>UK1</SDC_TO>
  </ROW>
</RSET>
但10gR2不支持这种语法

演示在11gR2下运行:

select xmlserialize(content xmlquery('
  copy $i := $p modify (
    for $j in $i/RSET/ROW/SDC_TO[text()="UK0"]
      return replace value of node $j with "UK1"
    )
    return $i'
  passing xmltype('<?xml version="1.0"?>
<RSET>
 <ROW>
  <SDC_FNAME>JQ13868001.XML</SDC_FNAME>
  <SDC_RECORD>6</SDC_RECORD>
  <SDC_FROMDT>06/14/2017 08:13:58</SDC_FROMDT>
  <SDC_TODT>06/16/2017 08:13:58</SDC_TODT>
  <SDC_TNAME>S_STYLE</SDC_TNAME>
  <SDC_FROM>AB</SDC_FROM>
  <SDC_TO>UK0</SDC_TO>
 </ROW>
 <ROW>
  <SDC_FNAME>JQ13868002.XML</SDC_FNAME>
  <SDC_RECORD>6</SDC_RECORD>
  <SDC_FROMDT>06/14/2017 08:13:58</SDC_FROMDT>
  <SDC_TODT>06/16/2017 08:13:58</SDC_TODT>
  <SDC_TNAME>S_STYLE</SDC_TNAME>
  <SDC_FROM>AB</SDC_FROM>
  <SDC_TO>UK1</SDC_TO>
 </ROW>
</RSET>') AS "p"
  returning content) indent) as result
from dual;

RESULT                                                                          
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<RSET>
  <ROW>
    <SDC_FNAME>JQ13868001.XML</SDC_FNAME>
    <SDC_RECORD>6</SDC_RECORD>
    <SDC_FROMDT>06/14/2017 08:13:58</SDC_FROMDT>
    <SDC_TODT>06/16/2017 08:13:58</SDC_TODT>
    <SDC_TNAME>S_STYLE</SDC_TNAME>
    <SDC_FROM>AB</SDC_FROM>
    <SDC_TO>UK1</SDC_TO>
  </ROW>
  <ROW>
    <SDC_FNAME>JQ13868002.XML</SDC_FNAME>
    <SDC_RECORD>6</SDC_RECORD>
    <SDC_FROMDT>06/14/2017 08:13:58</SDC_FROMDT>
    <SDC_TODT>06/16/2017 08:13:58</SDC_TODT>
    <SDC_TNAME>S_STYLE</SDC_TNAME>
    <SDC_FROM>AB</SDC_FROM>
    <SDC_TO>UK1</SDC_TO>
  </ROW>
</RSET>

可以使用BATBACH吗file@dkoothan-您可以让批处理文件通过SQL*Plus运行脚本。这里有很多例子。假设您在某个时候正在将XML加载到Oracle中,或者为什么要在这里使用Oracle?因此,这可以用来更新表中已有的值,使用updateyour_table设置your_xml=updatexmlyour_xml。。。。如果XML还不在数据库中,那么您可以查看SQL*加载器或。试图通过批处理脚本插入超过4k的值有点麻烦。是否可以使用.batchfile@dkoothan-您可以让批处理文件通过SQL*Plus运行脚本。这里有很多例子。假设您在某个时候正在将XML加载到Oracle中,或者为什么要在这里使用Oracle?因此,这可以用来更新表中已有的值,使用updateyour_table设置your_xml=updatexmlyour_xml。。。。如果XML还不在数据库中,那么您可以查看SQL*加载器或。试图通过批处理脚本插入超过4k的值有点困难。