create or replace trigger BillMadeUpdate
  before update of made on bill  
  for each row
DECLARE
  CURSOR curBF(billUUID bf.billuuid%type) IS SELECT BillUUID, FoodId, Copies FROM bf WHERE BillUUID = :new.billUUID;
  CURSOR curFM(foodId fm.foodid%type) IS SELECT * FROM fm WHERE FoodId = foodId;
  foodId bf.foodid%type;             -- 菜编号
  copies bf.copies%type;              -- 份数
  materialID  fm.materialid%type;     -- 食材编号
  materialNum fm.materialnumber%type; -- 食材量
BEGIN
 -- 一个订单会有多道菜
FOR r in curBF(:new.BillUUID)
LOOP
    foodId := r.FoodId;
    copies := r.copies;
-- 一道菜对应多种食材
   FOR r1 IN curFM(foodId)
   LOOP
     materialID := r1.MaterialId;
     materialNum := r1.Materialnumber * copies;
      UPDATE Material SET Remain = Remain - materialNum WHERE  r1.MaterialId = materialId;
   END LOOP;
END LOOP;
end BillMadeUpdate;
上面运行不明白多减去了什么

解决方案 »

  1.   

    现在不管是maded改为1还是改为0都会执行相应的触发器。
    按要求应该是改为1才执行,所以在for each row后面加一个判断条件
    WHEN (NEW.made = 1)
      

  2.   

    CURSOR curFM(foodId fm.foodid%type) IS SELECT * FROM fm WHERE FoodId = foodId;这里你定义的参数名和字段名一样,在 select 的 where 条件里,不会把 = 右边的 foodid 认成参数变量,而是当成字段,所以你的游标就变成了查询 fm 表所有记录了
      

  3.   

    这个无所谓,求教下:
    BEGIN
    FOR r in curBF(:new.BillUUID)
    LOOP
      foodId := r.FoodId;
      copies := r.copies;
      FOR r1 IN curFM(foodId)
      LOOP
      materialID := r1.MaterialId;
      materialNum := r1.Materialnumber * copies;
      UPDATE Material SET Remain = Remain - materialNum WHERE r1.MaterialId = materialId;
      END LOOP;
    END LOOP;
    这里面的逻辑好像在实际中多减去了点东西