如何更新DB2 table结构XML中多次出现的XML节点?
How to update XML node occurring multiple times in XML of DB2 table structure?
我们遇到了 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>
- 如果
<classDescriptionOptionText>
节点值为“所有活跃的全职主管”,则上面以蓝色突出显示的 <classDescriptionOption>
节点需要更新为 6 的值。
- 但我们无法实现这一点,因为可能存在多个
<class dataStr="list">
,其中可能存在 <classDescriptionOption>
。
- 当我们编写 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" 具有监督者选项文本的节点,访问选项并更新它。
我们遇到了 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>
- 如果
<classDescriptionOptionText>
节点值为“所有活跃的全职主管”,则上面以蓝色突出显示的<classDescriptionOption>
节点需要更新为 6 的值。 - 但我们无法实现这一点,因为可能存在多个
<class dataStr="list">
,其中可能存在<classDescriptionOption>
。 - 当我们编写 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" 具有监督者选项文本的节点,访问选项并更新它。