Я предлагаю выполнить только один запрос (мы не хотим выполнять дополнительную работу , запросив Oracle дважды , загрузив данные на рабочую станцию и нажав Agian для Oracle). Насколько я вижу из вашего
"Update t_payment set amount = :amount where penalty_order_id = (select id from t_penalty_order where protokol_no = :invoiceNumber)";
код, вы хотите обновить t_payment
таблицу, добавив немного дополнительных денег к amount
полю с примененным условием:
update t_payment
set amount = amount + SOME_EXTRA_MONEY
where penalty_order_id in (select p.id
from t_penalty_order p
where p.protokol_no = :invoiceNumber)
Мы должны определить, что такое SOME_EXTRA_MONEY
: мы можем попытаться вывести его из запроса
"select amount from t_payment where penalty_order_id = (select id from t_penalty_order where protokol_no = :invoiceNumber)";
Итак, у нас есть (я добавил Sum
на случай, если у нас несколько записей, и поэтому нужно их суммировать и Nvl
на случай, если у нас нет - в в этом случае дополнительная сумма 0
):
update t_payment
set amount = amount + (select Nvl(Sum(t.amount), 0)
from t_payment t
where t.penalty_order_id in (select p.id
from t_penalty_order p
where p.protokol_no = :invoiceNumber))
where penalty_order_id in (select p.id
from t_penalty_order p
where p.protokol_no = :invoiceNumber)
Время выполнения этого запроса:
using (OracleCommand command2 = new OracleCommand()) {
command2.CommandText =
@"update t_payment
set amount = amount + (select Nvl(Sum(t.amount), 0)
from t_payment t
where t.penalty_order_id in (select p.id
from t_penalty_order p
where p.protokol_no = :invoiceNumber))
where penalty_order_id in (select p.id
from t_penalty_order p
where p.protokol_no = :invoiceNumber)";
command2.Parameters.Add(
new OracleParameter(@"invoiceNumber", OracleDbType.Varchar2, 255)
).Value = request.invoiceNumber;
command2.ExecuteNonQuery();
}