由于某种原因,我很难完全理解触发器。对于我的作业,我需要创建一个表,其中包含每种产品的产品ID,总销售额和总销售量(这些列已经在两个不同的表中)。然后,我创建一个触发器,当另一个表中的orderplaced列更新为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;
/
答案 0 :(得分:1)
您可以使用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;
/
答案 1 :(得分:0)
基本上是这样的:
您有一个记录单个订单的表。它可能具有产品ID,数量和总计或类似的列。
您将触发代码放在此表上。
当某人在此处插入新记录时,您将获取数量和/或总计并更新主产品表。您将新数量和总计添加到产品ID匹配的主表中的现有汇总值中。