ВЫБРАТЬ ... ДЛЯ ОБНОВЛЕНИЯ в пакете Oracle - PullRequest
0 голосов
/ 02 декабря 2018

Я создал PACKAGE и PACKAGE BODY для оператора обновления,

Я не нашел ничего в StackOverFlow по этому поводу, интересно, хорошо ли я это сделал, и измените ли вы что-нибудь.

если я вызываю процедуру

begin
account_api.upd_account(1, 'user', 1000)
end;

Эти процедуры должны быть заблокированы до тех пор, пока я не завершу транзакцию с оператором фиксации

CREATE OR REPLACE PACKAGE account_api AS
PROCEDURE upd_account
          (
            p_acc_id     accounts.acc_id%type
          , p_acc_name   accounts.acc_name%type
          , p_acc_amount accounts.acc_amount%type
      );
end account_api;
 /

CREATE OR REPLACE PACKAGE BODY account_api AS
PROCEDURE upd_account (
            p_acc_id     accounts.acc_id%type
          , p_acc_name   accounts.acc_name%type
          , p_acc_amount accounts.acc_amount%type
)
is
l_current_balance NUMBER;
l_new_balance NUMBER;

BEGIN

  SELECT acc_amount INTO l_current_balance
  FROM accounts
  WHERE acc_id = p_acc_id
  FOR UPDATE;

  l_new_balance := l_current_balance + p_acc_amount;

  IF l_new_balance < 0 THEN
      raise_application_error(-20001, 'Sorry you re overdrawn');
  END IF;

  UPDATE accounts
  SET acc_amount = l_new_balance,
      acc_name = p_acc_name
  WHERE acc_id = p_acc_id;
COMMIT;
end;
end account_api;
/

1 Ответ

0 голосов
/ 02 декабря 2018

Процедура мне подходит, но я бы упростил ее только до одного оператора, и я бы добавил явный оператор ROLLBACK, что-то вроде этого:

  UPDATE accounts
  SET acc_amount = acc_amount + p_acc_amount,
      acc_name = p_acc_name
  WHERE acc_id = p_acc_id
  RETURNING acc_amount INTO l_new_balance;
  IF l_new_balance < 0 THEN
      rollback;
      raise_application_error(-20001, 'Sorry you re overdrawn');
  ELSE
      commit;
  END IF;

Нет необходимости использовать дополнительные SELECT ... FOR UPDATE для блокировки строки, поскольку операторы UPDATE также блокируют строку.Благодаря предложению RETURNING INTO вы можете получить новый баланс, а затем проверить его после обновления, если новый баланс слишком низкий, то откат изменений, в противном случае зафиксировать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...