Как обновить XML-узел, встречающийся несколько раз в XML структуры таблицы DB2?

Мы столкнулись с проблемой с DB2 SQL. Мы пытаемся проверить, можем ли мы найти решение этой проблемы.

Постановка задачи:

  1. Написание SQL для обновления узла XML, который встречается несколько раз во вложенной форме в зависимости от некоторых условий. Ниже представлена ​​структура XML. <RFPData> — корневой узел.
<RFPData>
.
.
.
.
<class dataStr="list">
                .
.
.
</class >
<class dataStr="list">
    <classCheckedProductStr>Life &amp;lt;br/&amp;gt;Dental &amp;lt;br/&amp;gt;</classCheckedProductStr>
    <classDescriptionOptionText>All Active Full-Time Assistant Vice Presidents</classDescriptionOptionText>
    <classDescriptionOption>5</classDescriptionOption>
    <life>
        <ClsLifePayPeriod>W</ClsLifePayPeriod>
        <coverage dataStr="list">
           <status>ACTIVE</status>
            <coverageId>50</coverageId>
            <coverageName>Buy Up Life with AD&amp;D</coverageName>
            <ClassLifeBasicLifeEmployee>22</ClassLifeBasicLifeEmployee>
            <covId>50</covId>
            <ClassLifeBasicLifeDependents>34</ClassLifeBasicLifeDependents>
            <isCoverageSelected>Y</isCoverageSelected>
            <SQ>0</SQ>
        </coverage>
        <coverage dataStr="list">
            <status>ACTIVE</status>
            <coverageId>54</coverageId>
            <coverageName>Buy Up Dependent Life with AD&amp;D</coverageName>
            <ClassLifeBasicLifeEmployee>44</ClassLifeBasicLifeEmployee>
            <covId>54</covId>
            <ClassLifeBasicLifeDependents>43</ClassLifeBasicLifeDependents>
            <isCoverageSelected>Y</isCoverageSelected>
            <SQ>1</SQ>
        </coverage>
        <clsFutureEmpWaitingPeriodRule>1STFLWP</clsFutureEmpWaitingPeriodRule>
        <clsCurrentEmpWaitingPeriodRule>1STFLWP</clsCurrentEmpWaitingPeriodRule>
        <status>ACTIVE</status>
        <clsCurrentEmpAveragedOver>-1</clsCurrentEmpAveragedOver>
        <isCoverageChecked>Y</isCoverageChecked>
        <clsCurrentEmpEarningsDefinition>-1</clsCurrentEmpEarningsDefinition>
        <clsFutureEmpWaitingPeriodUnit>DY</clsFutureEmpWaitingPeriodUnit>
        <ClsCurrentEmpLifeWaitingPeriodValue>14</ClsCurrentEmpLifeWaitingPeriodValue>
        <clsCurrentEmpWaitingPeriodUnit>DY</clsCurrentEmpWaitingPeriodUnit>
        <ClsLifeHoursWorked>12</ClsLifeHoursWorked>
        <ClsFutureEmpLifeWaitingPeriodValue>33</ClsFutureEmpLifeWaitingPeriodValue>
    </life>
    <SQ>0</SQ>
</class>
<class dataStr="list">
                .
.
.
</class >
.
.
.
.
</RFPData>
  1. Узел <classDescriptionOption>, выделенный синим цветом выше, необходимо обновить до значения, скажем, 6, если значение узла <classDescriptionOptionText> — «Все активные штатные супервайзеры».
  2. Но мы не можем добиться этого, так как может быть несколько <class dataStr="list">, в которых может присутствовать <classDescriptionOption>.
  3. Когда мы написали SQL-скрипт, он обновил все вхождения со значением 6, которое мы указываем в заявлении об обновлении, даже если мы попытаемся сравнить со значением <classDescriptionOptionText> как «Все активные штатные супервайзеры».

Используемый скрипт обновления показан ниже.

UPDATE T_SL_APP
SET SL_XML_TXT = XMLQUERY('
copy $new := $SL_XML_TXT
modify (
for $i in $new/RFPData/classSetup/class/classDescriptionOption  return
do replace value of $i with "6"
)
return $new')
WHERE SL_APP_ID = '1184'
and xmlexists('$SL_XML_TXT//RFPData/classSetup/class[classDescriptionOptionText = "All Active Full-Time Supervisors"]');

Так может кто-нибудь, пожалуйста, помогите нам решить. Вся структура XML прилагается для справки.


person Sam    schedule 27.11.2015    source источник
comment
Пробовали ли вы добавлять необходимые предикаты в XQuery, т. е. внутри выражения for? xmlexists — это тест для поиска подходящих документов, но узлы для обновления находятся внутри выражения XQuery.   -  person data_henrik    schedule 27.11.2015
comment
@data_henrik Это то, чего я не могу сделать. Не могли бы вы предложить и дать образец.   -  person Sam    schedule 27.11.2015


Ответы (1)


Не проверено, но попробуйте использовать предикат в XQuery:

copy $new := $SL_XML_TXT
modify (
     for $i in $new/RFPData/classSetup/class[classDescriptionOptionText = "All Active Full-Time Supervisors"]/classDescriptionOption   
     return
         do replace value of $i with "6"
       )
return $new

Вышеприведенное будет перебирать только те узлы «класса», которые имеют OptionText с супервизорами, получают доступ к Option и обновляют его.

person data_henrik    schedule 27.11.2015