создание триггера, который обновляет таблицу при обновлении столбца в другой таблице - PullRequest
0 голосов
/ 05 мая 2019

Почему-то мне трудно понять триггеры. Для моего домашнего задания мне нужно создать таблицу, в которой будут храниться идентификатор продукта, общий объем продаж и общее количество проданных товаров (эти столбцы уже находятся в двух разных таблицах). Затем я создаю триггер, который обновляет эту таблицу, когда столбец с порядком размещения из другой таблицы обновляется до 1. Не совсем уверен, с чего начать. Поскольку таблица, которую я создал, пуста, сделаю ли я таблицу UPDATE, как предлагает назначение, или INSERT, поскольку столбцы пусты? Если кто-то может направить меня в правильном направлении, я был бы очень признателен ..

CREATE TABLE bb_sales_sum (
    idProduct number(2) NOT NULL,
    total number(6,2),
    quantity number); 

CREATE OR REPLACE TRIGGER BB_SALESUM_TRG
    AFTER UPDATE OF orderplaced on bb_basket 
    FOR EACH ROW
    WHEN (NEW.orderplaced = 1)
DECLARE 
    lv_count Number;
BEGIN   
    if :new.orderplaced = 1 then 
        for item in 
            (select idproduct, (quantity * price) AS total, quantity
            from bb_basketitem
            where idbasket = :old.idbasket)
    loop
        select count(*)
        into lv_count
        from bb_sales_sum where idProduct = item.idproduct;

        if lv_count = NULL then
            INSERT INTO bb_sales_sum
            VALUES (item.idproduct, item.total, item.quantity);
        else
            update bb_sales_sum 
            set quantity = item.quantity where
            idProduct = item.idproduct;
        end if;
    end loop;
    end if;

END; 
/

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Вы можете использовать MERGE вместо обновления, которое создаст новую строку, если ее еще нет для данного idproduct, и обновит количество и сумму для тех строк, которые уже доступны.

CREATE OR REPLACE TRIGGER bb_salesum_trg
    AFTER UPDATE OF orderplaced on bb_basket 
      FOR EACH ROW
    WHEN (NEW.orderplaced = 1)

BEGIN   
  MERGE INTO bb_sales_sum t USING 
  ( select :new.idproduct as idproduct ,
           :new.quantity  as quantity,
           :new.total     as total 
           from dual ) s  
     ON (s.idproduct = t.idproduct ) 
         WHEN MATCHED THEN UPDATE
            SET  quantity  = s.quantity,
                 total     = s.total
          WHEN NOT MATCHED THEN
     INSERT (
          idproduct,quantity,total)
     VALUES
          ( :new.idproduct,:new.quantity,:new.total );
END;
/

DEMO

0 голосов
/ 05 мая 2019

В основном это выглядит так:

У вас есть таблица, в которой записывается индивидуальный заказ. Может иметь столбцы «Идентификатор продукта», «Количество» и «Итого» или аналогичные.

Вы положили свой код триггера в эту таблицу.

Когда кто-то вставляет сюда новую запись, вы берете количество и / или сумму и обновляете основную таблицу продуктов. Вы добавите новое количество и сумму к существующим суммированным значениям в основной таблице, где совпадает идентификатор продукта.

...