业务老师给我提了个需求,要修改xmltype里的标签值,开写
update table
set xmlcolumn = xmlserialize(content updateXML(UpdateXML(
xmltype(xmlcolumn,871), '//@faSong', fasongstring)
,'//@jieShou', jieshoustring) as blob )
where CODE = mycode;
这个代码是用来修改xml里的两个标签值的,一个是fasong,一个是jieshou,直接@fasong和@jieshou,就能够定位这两个属性值,要是出现多个就,得写绝对路径了,gg。。
将fasong标签的值改成fasongstiring,jieshou也是,使用updatexml函数修改,由于要改两个直接套两个函数。
最里层的xmltype函数,则是将本来以blob存贮的xml文本转换成xmltype类型,才能进行后续的updatexml。
最后再用xmlserialize()函数将修改好的xml数据从xmltype转成blob以update。
但是但是,这里会有编码问题,xmlserialize默认的是gbk编码,可是我的xml脚本都是utf-8的,所以会冲突,那这代码执行commit会有啥结果呢??
结果就是,只能update一次,后续不能用此sql再对xml进行修改。。。
就因为原本是utf8的xml,因为使用了xmlserialize,而被改成gbk。二次修改,mmm,我搞不清这逻辑。。
折腾了一天,得出修改方案:
update table
set xmlcolumn = xmlserialize(content updateXML(UpdateXML(
xmltype(xmlcolumn,871), '//@faSong', fasongstring)
,'//@jieShou', jieshoustring) as blob ENCODING 'utf-8')
where CODE = mycode;
xmlserialize加一个参数就好了ENCODING 'utf-8',意思估计就是以utf8的编码格式将xml转成blob吧。
解决,可以对同一对象update多次了。
这个问题真的太少遇见了,记录一下。