0

背景:我想将一些员工的津贴值从 1875 英镑增加到 7500 英镑,并将他们的余额更新为 7500 英镑减去他们目前使用的任何金额。

我的 Update 语句一次只适用于一名员工,但我需要从包含大约 6000 条的表中更新大约 200 条记录。

我正在努力锻炼如何修改以下内容以更新多条记录,但只有我需要更新的 200 条记录。

UPDATE employeeaccounts 
SET    xml = To_clob(Updatexml(Xmltype(xml), 
                 '/EmployeeAccount/CurrentAllowance/text()',187500, 
                 '/EmployeeAccount/AllowanceBalance/text()', 
                 750000 - (SELECT Extractvalue(Xmltype(xml), 
                 '/EmployeeAccount/AllowanceBalance', 
   'xmlns:ts=\"http://schemas.com/\", xmlns:xt=\"http://schemas.com\"' 
   ) 
      FROM   employeeaccounts 
      WHERE  id = '123456'))) 
WHERE  id = '123456' 

我要更新的 xml 列(存储为 clob)的示例。表的列 ID 包含员工 ID EG 123456 的 PK

<EmployeeAccount>
 <LastUpdated>2016-06-03T09:26:38+01:00</LastUpdated>
 <MajorVersion>1</MajorVersion>
 <MinorVersion>2</MinorVersion>
 <EmployeeID>123456</EmployeeID>
 <CurrencyID>GBP</CurrencyID>
 <CurrentAllowance>187500</CurrentAllowance>
 <AllowanceBalance>100000</AllowanceBalance>
 <EarnedDiscount>0.0</EarnedDiscount>
 <NormalDiscount>0.0</NormalDiscount>
 <AccountCreditLimit>0</AccountCreditLimit>
 <AccountBalance>0</AccountBalance>
</EmployeeAccount>
4

1 回答 1

0

您不需要子查询来获取旧余额,您可以使用当前行中的值;这意味着您不需要关联该子查询,只需in()在主语句中使用:

UPDATE employeeaccounts 
SET    xml = To_clob(Updatexml(Xmltype(xml), 
                 '/EmployeeAccount/CurrentAllowance/text()',187500, 
                 '/EmployeeAccount/AllowanceBalance/text()', 
                 750000 - Extractvalue(Xmltype(xml), 
                   '/EmployeeAccount/AllowanceBalance', 
                   'xmlns:ts=\"http://schemas.com/\", xmlns:xt=\"http://schemas.com\"')
    )) 
WHERE  id in (123456, 654321, ...);
于 2016-06-03T09:42:08.310 回答