Выберите значение как из OLD TABLE, так и из FINAL TABLE во время обновления - PullRequest
0 голосов
/ 16 октября 2018

У меня есть написанное мной утверждение UPDATE, которое примет @CHANGE (положительное или отрицательное целочисленное значение) и обновит CURRENT_INVENTORY для этого типа элемента.

UPDATE ITEM_INVENTORY
SET    CURRENT_INVENTORY = MAX(CURRENT_INVENTORY + @CHANGE, 0),
       LAST_UPD_TSTAMP = CURRENT_TIMESTAMP,
       LAST_UPD_SOURCE = @SOURCE
WHERE  LOCATION = @LOCATION
       AND ITEM_TYPE = @ITEM_TYPE;

Я быхотелось бы узнать, что такое CURRENT_INVENTORY до и после запуска этого обновления.Есть ли способ выбрать значения *1001* и FINAL TABLE CURRENT_INVENTORY?

Я хочу отобразить сообщение в соответствии с "{location} инвентаризацией"изменен с {старый} на {новый} ".Я мог бы использовать отдельный SELECT, чтобы получить старое / текущее значение, выполнить математику в моем коде, а затем ОБНОВИТЬ строку в таблице.Я считаю, что это будет восприимчиво к условиям гонки (поскольку первый SELECT не заблокирует строку), поэтому я пытаюсь сделать это в одном запросе.

Не думаю, что смогу выбратьИ СТАРЫЙ, и ФИНАЛЬНЫЙ, поэтому я считаю, что лучшие решения, которые у меня есть, это:

  1. Выберите значение из OLD TABLE и продублируйте логику из оператора CASE для получения нового значения
  2. Выбратьзначение из OLD TABLE и выберите новое значение (в той же транзакции, когда мое ОБНОВЛЕНИЕ заблокировало строку)

Есть ли лучший / правильный способ сделать это?

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Для этого вы можете использовать «выбрать из обновления» (руководство по SQL).Пример:

SELECT EMPNO, SALARY, BONUS , OLD_SALARY , OLD_BONUS
    FROM FINAL TABLE
        (UPDATE EMP  INCLUDE  ( OLD_SALARY DECIMAL(9,2)
                              , OLD_BONUS DECIMAL(9,2))
        SET SALARY     = SALARY+1000
        ,   BONUS      = 0
        ,   OLD_SALARY = SALARY
        ,   OLD_BONUS  = BONUS
        WHERE SALARY > 28000);
0 голосов
/ 16 октября 2018

Обновление встроенного представления вместо таблицы:

SELECT CURRENT_INVENTORY, CURRENT_INVENTORY_OLD
FROM FINAL TABLE(
  UPDATE (SELECT *, CURRENT_INVENTORY AS CURRENT_INVENTORY_OLD 
          FROM ITEM_INVENTORY)
  SET CURRENT_INVENTORY = CASE 
                             WHEN CURRENT_INVENTORY + @CHANGE < 0 THEN 0
                             ELSE CURRENT_INVENTORY + @CHANGE
                           END,
       LAST_UPD_TSTAMP = CURRENT_TIMESTAMP,
       LAST_UPD_SOURCE = @SOURCE
  WHERE LOCATION = @LOCATION
    AND ITEM_TYPE = @ITEM_TYPE
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...