2016-06-03 3 views
0

Контекст: Я хочу увеличить размер пособия для некоторых сотрудников с £ 1875 до £ 7500 и обновить их баланс до 7500 фунтов стерлингов за вычетом того, что они использовали в настоящее время.updatexml только для определенных строк

Мое заявление Update работает на одного работника в то время, но мне нужно обновить около 200 записей, из таблицы, содержащей около 6000.

Я изо всех сил, чтобы тренировки, как изменить ниже, чтобы обновить более одна запись, но только 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 держащиеся PK сотрудники ID EG 123456

<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> 
+0

Как 200 вы хотите обновить определили? И можете ли вы добавить некоторые примеры данных к вопросу? –

+0

Поскольку это всего лишь 200, которые я отправил через excel, я надеюсь просто сделать идентификатор в (123456, 654321 и т. Д. – user3811820

+0

Так что действительно проблема заключается в том, как сопоставить старый баланс аккаунта, который вы получаете в subquery, с обновляемой строкой - так как вы не можете просто поместить то же самое в список в обоих? –

ответ

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, ...); 
+0

Да Алекс точно вправо, страх, что я просто его переусердствовал! – user3811820

Смежные вопросы