#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;
- Создайте триггер (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)? Это меня немного смущает.