如何更新DB2 table结构XML中多次出现的XML节点?

How to update XML node occurring multiple times in XML of DB2 table structure?

我们遇到了 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. 如果 <classDescriptionOptionText> 节点值为“所有活跃的全职主管”,则上面以蓝色突出显示的 <classDescriptionOption> 节点需要更新为 6 的值。
  2. 但我们无法实现这一点,因为可能存在多个 <class dataStr="list">,其中可能存在 <classDescriptionOption>
  3. 当我们编写 SQL 脚本时,它使用我们在更新语句中提供的值 6 更新了所有出现的事件,即使我们尝试将 <classDescriptionOptionText> 值等同于“All Active Full -时间主管。

使用的更新脚本如下

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的完整结构供参考

未测试,但尝试在 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

以上只会迭代那些 "class" 具有监督者选项文本的节点,访问选项并更新它。