oracle 在与另一个节点的最大值相同的级别插入节点

eyh26e7m  于 2022-11-22  发布在  Oracle
关注(0)|答案(1)|浏览(139)

我 有 一 个 保存 xml 的 oracle clob 。

<acctInfo>
    <acctCalculations>
        <acctCalculation>
            <acctCalculationDate>2020-10-20</acctCalculationDate>
            <HouseholdIncome>1960.00</HouseholdIncome>
            <NumberOfOccupants>4</NumberOfOccupants>
            <acctLevel>1</acctLevel>
            <incomeVerificationDate>2020-10-20</incomeVerificationDate>
            <incomeVerifiedBy>CJOE</incomeVerifiedBy>
        </acctCalculation>
        <acctCalculation>
            <acctCalculationDate>2021-01-15</acctCalculationDate>
            <HouseholdIncome>1960.00</HouseholdIncome>
            <NumberOfOccupants>4</NumberOfOccupants>
            <acctLevel>1</acctLevel>
            <incomeVerificationDate>2020-10-20</incomeVerificationDate>
            <incomeVerifiedBy>CJOE</incomeVerifiedBy>
       </acctCalculation>
        <acctCalculation>
            <acctCalculationDate>2021-10-01</acctCalculationDate>
            <HouseholdIncome>0</HouseholdIncome>
            <NumberOfOccupants>4</NumberOfOccupants>
            <acctLevel>1</acctLevel>
            <incomeVerificationDate>2021-10-01</incomeVerificationDate>
            <incomeVerifiedBy>BYAJRIS</incomeVerifiedBy>
        </acctCalculation>
    </acctCalculations>
</acctInfo>

中 的 每 一 个
我 需要 在 <acctCalculationDate>2021-10-01</acctCalculationDate> 之后 添加 一 个 类似 <NetHouseholdIncome>15</NetHouseholdIncome> 的 节点 - 因为 它 是 最 大 计算 日期
所以 看 起来

<acctCalculation>
    <acctCalculationDate>2021-10-01</acctCalculationDate>

* <NetHouseholdIncome>15</NetHouseholdIncome>*

    <HouseholdIncome>0</HouseholdIncome>
    <NumberOfOccupants>4</NumberOfOccupants>
    <acctLevel>1</acctLevel>
    <incomeVerificationDate>2021-10-01</incomeVerificationDate>
    <incomeVerifiedBy>BYAJRIS</incomeVerifiedBy>
</acctCalculation>

格式
所以 我 认为 类似 于 bellow 的 东西 应该 可以 工作 , 但是 我 似乎 找 不到 xpath 应该 是 什么 , 以 获得 我 想 插入 的 同一 级别 节点 的 最 大 值 。

select
   to_clob(
       APPENDCHILDXML(
          xmltype(field_Data_area),
          '*/acctInfo/acctCalculations/acctCalculation[3]*',
          xmltype('<NetHouseholdIncome>15</NetHouseholdIncome>')
       )
   )

格式
我 还 考虑 过 使用 " position for ordinality " 将 原始 xml 传递 到 xmltable 中 , 以 获得 最 大 值 的 节点 , 并 在 该 节点 处 进行 更新 , 但 我 不 确定 当 我 在 update xml 语句 中 使用 position number 时 是否 会 保持 相同 的 节点 计数

select 
    AcctCalculationDate, position
from 
    data_area
    XMLTABLE ('/acctInfo/acctCalculations/acctCalculation' --id row in table
    passing xmltype('FIELD_DATA_AREA')
    columns
    position for ordinality,
    acctCalculationDate varchar2(12) path 'acctCalculationDate'
) xml

格式
我 尝试 查找 xmlpath 查询 以 获取 最 大 值 节点 。 并 考虑 使用 两 个 查询 , 一 个 查询 获取 节点 编号 , 然后 使用 一 个 查询 通过 该 节点 更新 , 但 我 不 确定 节点 编号 是否 会 保持 一致 。 查找 语法 以 获取 最 大 节点 或 ... 只是 我 应该 使用 的 策略 来 插入 这些 值

gorkyyrv

gorkyyrv1#

with q as
 (
   select 
    max(t.position) keep(dense_rank last order by acctCalculationDate) pos
 from data_area, 
  xmltable('/acctInfo/acctCalculations/acctCalculation' 
             passing field_Data_area 
             columns 
              acctCalculationDate date path 'acctCalculationDate',
              position for ordinality
          ) t
 )
    select 
appendChildXML(data_area.field_Data_area,
                       '/acctInfo/acctCalculations/acctCalculation['||
                         q.pos||
                         ']',xmltype('<NetHouseholdIncome>15</NetHouseholdIncome>'))
                         
from data_area, 
  q

中 的 每 一 个
如果 您 的 data _ area 表 中 只有 一 个 clob , 那么 我 就 可以 使用 它 。

相关问题