Обновление содержимого столбца Oracle XMLType для заданного значения

У меня есть таблица SECTION_ANSWER в базе данных Oracle 11g, в которой есть столбец 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>

Мне нужно обновить ответ «105» до «205». Я делал что-то подобное в прошлом, используя UPDATEXML. Например, если бы мне нужно было обновить идентификатор вопроса 1, у которого есть только один ответ, я мог бы сделать что-то вроде:

UPDATE SECTION_ANSWER sa
SET sa.section_answerxml = updatexml(sa.section_answerxml, '//section[@sectionID="1"]/question[@questionID="1"]/answer/text()', 'BLUE') 

Однако на этот раз у меня возникли проблемы с обновлением questionID 2, поскольку существует несколько узлов ответов, и я не знаю, в каком узле будет контент, который необходимо обновить. Может ли кто-нибудь пролить свет на то, как выполнить такое обновление ?


person The Gilbert Arenas Dagger    schedule 03.12.2013    source источник


Ответы (1)


это обновит все узлы ответов на вопрос 2, который имеет 105.

UPDATE SECTION_ANSWER sa
SET sa.section_answerxml = updatexml(sa.section_answerxml,
'//section[@sectionID="1"]/question[@questionID="2"]/answer[text()="105"]/text()', '205')

или вы можете обновить по позиции

UPDATE SECTION_ANSWER sa
SET sa.section_answerxml = updatexml(sa.section_answerxml,
'//section[@sectionID="1"]/question[@questionID="2"]/answer[position()=3]/text()', '205')
person edgar    schedule 03.12.2013
comment
Спасибо Эдгар!! Я не знал, что можно указать [text()=105]. Это решило мою проблему :) - person The Gilbert Arenas Dagger; 03.12.2013