求教以下代码
时间: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;
上面运行不明白多减去了什么
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)
按要求应该是改为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 表所有记录了
这里你定义的参数名和字段名一样,在 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;
这里面的逻辑好像在实际中多减去了点东西
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 表所有记录了
CURSOR curFM(foodId fm.foodid%type) IS SELECT * FROM fm WHERE FoodId = foodId;
这里你定义的参数名和字段名一样,在 select 的 where 条件里,不会把 = 右边的 foodid 认成参数变量,而是当成字段,所以你的游标就变成了查询 fm 表所有记录了
太谢谢了
作者: LONG495881717 发布时间: 2011-11-08
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28