+ -
当前位置:首页 → 问答吧 → 求教以下代码

求教以下代码

时间:2011-11-08

来源:互联网

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;


上面运行不明白多减去了什么

作者: LONG495881717   发布时间: 2011-11-08

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

作者: LuiseRADL   发布时间: 2011-11-08

CURSOR curFM(foodId fm.foodid%type) IS SELECT * FROM fm WHERE FoodId = foodId;

这里你定义的参数名和字段名一样,在 select 的 where 条件里,不会把 = 右边的 foodid 认成参数变量,而是当成字段,所以你的游标就变成了查询 fm 表所有记录了

作者: opps_zhou   发布时间: 2011-11-08

这个无所谓,求教下:
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;
这里面的逻辑好像在实际中多减去了点东西

作者: LONG495881717   发布时间: 2011-11-08

引用 2 楼 opps_zhou 的回复:

CURSOR curFM(foodId fm.foodid%type) IS SELECT * FROM fm WHERE FoodId = foodId;

这里你定义的参数名和字段名一样,在 select 的 where 条件里,不会把 = 右边的 foodid 认成参数变量,而是当成字段,所以你的游标就变成了查询 fm 表所有记录了

太谢谢了

作者: LONG495881717   发布时间: 2011-11-08