求教以下代码

LONG495881717 2011-11-08 02:55:15
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;


上面运行不明白多减去了什么
...全文
54 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
LONG495881717 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 opps_zhou 的回复:]

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

这里你定义的参数名和字段名一样,在 select 的 where 条件里,不会把 = 右边的 foodid 认成参数变量,而是当成字段,所以你的游标就变成了查询 fm 表所有记录了
[/Quote]
太谢谢了
opps_zhou 2011-11-08
  • 打赏
  • 举报
回复
CURSOR curFM(foodId fm.foodid%type) IS SELECT * FROM fm WHERE FoodId = foodId;

这里你定义的参数名和字段名一样,在 select 的 where 条件里,不会把 = 右边的 foodid 认成参数变量,而是当成字段,所以你的游标就变成了查询 fm 表所有记录了
LONG495881717 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;
这里面的逻辑好像在实际中多减去了点东西
我心飞翔 2011-11-08
  • 打赏
  • 举报
回复
现在不管是maded改为1还是改为0都会执行相应的触发器。
按要求应该是改为1才执行,所以在for each row后面加一个判断条件
WHEN (NEW.made = 1)

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧