我在Oracle 11g数据库中有一个表SECTION_ANSWER,它有一个XMLType列.XML非常简单,它遵循以下结构:
<section sectionID="1">
<question questionID="1" questionType="text">
<answer>Green</answer>
</question>
<question questionID="2" questionType="multiselect">
<answer>101</answer>
<answer>102</answer>
<answer>105</answer>
<answer>107</answer>
</question>
</section>
Run Code Online (Sandbox Code Playgroud)
我需要将'105'的答案更新为'205'.我过去使用UPDATEXML做过类似的事情.例如,如果我要更新只有一个答案的questionID 1,我可以执行以下操作:
UPDATE SECTION_ANSWER sa
SET sa.section_answerxml = updatexml(sa.section_answerxml, '//section[@sectionID="1"]/question[@questionID="1"]/answer/text()', 'BLUE')
Run Code Online (Sandbox Code Playgroud)
但是,这次更新questionID 2我遇到了麻烦,因为有多个答案节点,我不知道需要更新的内容将在哪个节点中.任何人都可以了解如何执行此类更新?
我可以写:
update my_table
set xml = updateXML(xml, '/a/b', '1')
where document_id = 123
Run Code Online (Sandbox Code Playgroud)
现在,如果在同一更新查询中我也想将/ a / c设置为2(另外将/ a / b设置为1)呢?我很想写:
update my_table
set
xml = updateXML(xml, '/a/b', '1'),
xml = updateXML(xml, '/a/c', '2')
where document_id = 123
Run Code Online (Sandbox Code Playgroud)
但这给了我一个“ ORA-00957:重复的列名”。关于如何做到这一点的任何建议?
我在Oracle 11g的CLOB列中有这个xml值:
<Energy xmlns="http://euroconsumers.org/notifications/2009/01/notification">
<Gender>M</Gender>
<FirstName>MAR</FirstName>
<Name>VAN HALL</Name>
<Email/><Telephone>000000000</Telephone>
<InsertDate>2013-10-09</InsertDate>
</Energy>
Run Code Online (Sandbox Code Playgroud)
我想为几行更新InserDate的值.
我正在使用下面的sql命令:
update tmp_tab_noemail_test p1
set p1.sce_msg = updatexml(xmltype(p1.sce_msg),
'//Energy/InsertDate/text()','Not Valid').getClobVal()
Run Code Online (Sandbox Code Playgroud)
但是没有用.
您是否有一些想法只修改InsertDate的xml标记的值?
谢谢你的进步