在ORACLE 10G中将值更新为XML
我在文件夹中有下面的XML,我想找到并替换一些值。怎么做 示例:无论UK0在哪里,我都希望使用更新查询替换UK1在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 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的值有点困难。