Обновление информации о запасах при заполнении запроса на продукт

#sql #oracle #plsql #triggers

#sql #Oracle #plsql #триггеры

Вопрос:

Проблема:

В Brewbean есть таблица BB_PRODUCT_REQUEST, в которую запросы на пополнение запасов вставляются автоматически с помощью триггера. После того, как уровень запасов падает ниже уровня повторного заказа, срабатывает этот триггер и вводит запрос в таблицу. Эта процедура работает отлично; однако, когда сотрудники магазина записывают, что запрос на продукт был заполнен путем обновления столбцов DTRECD и COST таблицы, они хотят, чтобы уровень запасов в таблице product был обновлен. Создайте триггер с именем BB_REQFILL_TRG для выполнения этой задачи, используя следующие шаги в качестве руководства: 1. В SQL Developer выполните следующую инструкцию INSERT, чтобы создать запрос продукта, который можно использовать в этом назначении:

 INSERT INTO bb_product_request (idRequest, idProduct, dtRequest, qty) VALUES (3, 5, SYSDATE, 45); COMMIT;
 
  1. Создайте триггер (BB_REQFILL_TRG), чтобы он срабатывал при вводе полученной даты в таблицу BB_PRODUCT_REQUEST. Этот триггер должен изменить столбец ЗАПАСОВ в таблице BB_PRODUCT, чтобы отразить увеличение запасов. 3. Теперь протестируйте триггер. Сначала запрашиваем данные о запасах и переупорядочиваем данные для продукта 5. После обновления полученной даты значение старого запаса становится новым запасом 86. Я не уверен, что я делаю неправильно с триггером.

Код:

     CREATE OR REPLACE TRIGGER BB_REQFILL_TRG 
AFTER UPDATE OF DTRECD ON BB_PRODUCT_REQUEST
for EACH ROW

declare
    cursor c_product is
        select stock, reorder
        from bb_product
        where idproduct = :OLD.idproduct;

    v_dtrecd DATE := sysdate;

--    cursor c_dtrecd is

BEGIN
    select dtrecd
        into v_dtrecd
    from bb_product_request
    where idrequest = :OLD.idrequest;

    for x in c_product loop
        if v_dtrecd = :new.dtrecd then
            update bb_product
            set stock = x.stock   x.reorder
            where idproduct = :old.idproduct;
        end if;
    end loop;
END;
    update bb_product_request -- new value when updated (86) from the trigger    set DTRECD = sysdate, cost = 225
    where idrequest = 3;

    select stock, reorder -- stock (41), reorder (45)
    from bb_product
    where idproduct = 5;

    select * -- this verifies that dtrecd is updated as well
    from bb_product_request
    where idproduct = 5;
 

Комментарии:

1. Ваше обновление включено bb_product_request , ваш триггер включен BB_PRODUCT .

2. Триггеры не должны использоваться для реализации бизнес-логики. Поместите логику для обновления вашего инвентаря в процедуру, вызывайте процедуру при необходимости. Не спрашивайте меня, откуда я знаю … 🙂

3. После повторного рассмотрения вопроса это имеет смысл :). нужно ли мне обновлять (old.stock old.reorder)? Это меня немного смущает.