У меня есть таблица product и таблица sales. Внутри product у меня есть (product_id, p_desc, qty_stock), а в таблице sales - (sale_id, producto_id, sale_p_qty), где sale_p_qty - это количество, которое покупатель покупает у определенного продукта.
Возникает вопрос, как сделать триггер для обновления значения столбца qty_stock в таблице product (это значение будет запасом)? Я не могу сделать это. Я могу сделать триггер, который будет уменьшаться, но только на одно значение за раз. Правильным было бы получить sale_p_qty из таблицы sales и уменьшить в qty_stock, но я не могу этого сделать. Не могли бы вы помочь мне?
На этом моя попытка остановилась (процедуру не делал, не знаю, нужно ли вам в этом случае):
CREATE OR REPLACE TRIGGER trg_stock_ai AFTER INSERT OR UPDATE ON sale
FOR EACH ROW
declare
new_stock NUMBER (4);
--SELECT sale_p_qty INTO new_stock FROM sale
--SET new_stock = (SELECT sale_p_qty FROM sale);
BEGIN
SELECT sale_p_qty INTO new_stock FROM sale;
UPDATE product
SET qty_stock = qty_stock - new_stock
WHERE product.product_id =: NEW.product_id;
END;


Вы можете сделать это в два этапа:
CREATE OR REPLACE TRIGGER trg_stock_ai AFTER INSERT OR UPDATE ON sale
FOR EACH ROW
BEGIN
UPDATE product
SET qty_stock = (qty_stock - :NEW.sale_p_qty)
WHERE p.product_id = :NEW.product_id;
UPDATE product
SET qty_stock = (qty_stock + :OLD.sale_p_qty)
WHERE p.product_id = :OLD.product_id;
END;
Это должно работать как для вставок, так и для обновлений, даже при изменении product_id.
Не делай этого так. Рассчитайте количество запасов в реальном времени. Для этого, когда вы «покупаете» (или производите) что-то, помещайте это в таблицу SALES со знаком
+. Когда вы что-то продаете, положите это в таблицу ПРОДАЖ со знаком-. Затем, если вы хотите узнать количество на складе, простоselect sum(quantity) from sales where id = some_id.