О том, как создавать в Oracle Express - SQL. Триггер для обновления столбца

У меня есть таблица 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;

Не делай этого так. Рассчитайте количество запасов в реальном времени. Для этого, когда вы «покупаете» (или производите) что-то, помещайте это в таблицу SALES со знаком +. Когда вы что-то продаете, положите это в таблицу ПРОДАЖ со знаком -. Затем, если вы хотите узнать количество на складе, просто select sum(quantity) from sales where id = some_id.

Littlefoot 31.12.2018 15:25
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать это в два этапа:

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.

Другие вопросы по теме