Мы столкнулись с проблемой с DB2 SQL. Мы пытаемся проверить, можем ли мы найти решение этой проблемы.
Постановка задачи:
- Написание SQL для обновления узла XML, который встречается несколько раз во вложенной форме в зависимости от некоторых условий. Ниже представлена структура XML.
<RFPData>
— корневой узел.
<RFPData>
.
.
.
.
<class dataStr="list">
.
.
.
</class >
<class dataStr="list">
<classCheckedProductStr>Life &lt;br/&gt;Dental &lt;br/&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&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&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>
- Узел
<classDescriptionOption>
, выделенный синим цветом выше, необходимо обновить до значения, скажем, 6, если значение узла<classDescriptionOptionText>
— «Все активные штатные супервайзеры». - Но мы не можем добиться этого, так как может быть несколько
<class dataStr="list">
, в которых может присутствовать<classDescriptionOption>
. - Когда мы написали 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 прилагается для справки.