关于减去材料的问题 的请教
最近实习做了一个项目:餐厅系统,要求实现基本的餐厅功能,但在设计数据库的时候遇到了如下困难:
有关数据库如下:
SQL> select * from bill;
BILLDATE SEATID SUM VIP PAYED MADE BILLUUID BILLCHECK
-------- -------------- ------- --------- ---- ----- ---- -------------------------------- ---------
20111105125326 1 0.9 0 0 sda 0
20111105125617 2 1.0 0 0 abd 0
20111105125625 3 0.9 0 0 cdd 0
SQL> desc bill;
Name Type Nullable Default Comments
--------- ------------ -------- ----------------------------------- ----------
BILLDATE CHAR(14) to_char(sysdate, 'yyyymmddHH24MISS ') 此次消费日期
SEATID NUMBER(6) 此次消费餐桌号
SUM NUMBER(7,1) Y 此次消费总费用
VIP NUMBER(2,1) 1 客户是否VIP
PAYED NUMBER(1) 0 是否付款
MADE NUMBER(1) 0 菜是否完成
BILLUUID VARCHAR2(32) 订单uuid(主键)
BILLCHECK NUMBER(1) 0 核算金额
SQL> select * from bf;
BFID BILLUUID FOODID COPIES
------- -------------------------------- -------
1 sda 1 3
2 sda 2 9
3 sda 3 1
4 sda 9 3
5 abd 8 1
6 abd 10 1
7 abd 5 1
8 sda 5 1
9 cdd 6 1
10 cdd 7 5
SQL> desc bf;
Name Type Nullable Default Comments
-------- ------------ -------- ------- --------
BFID NUMBER(6) 订单--菜ID
BILLUUID VARCHAR2(32) 订单ID
FOODID NUMBER(6) 菜的ID
COPIES NUMBER(6) 1 菜的份数
SQL> select * from fm;
FOODID MATERIALID MATERIALNUMBER
------- ------- ---------- --------------
1 1 1
2 2 2
3 10 1
6 19 2
7 13 1
8 2 4
8 13 1
10 3 5
10 16 1
11 20 2
11 13 2
SQL> desc fm;
Name Type Nullable Default Comments
-------------- ------------ -------- ------------------------------------------------ --------
FMID VARCHAR2(32) 菜--材料ID
FOODID NUMBER(6) 菜ID
MATERIALID NUMBER(6) 食材ID
MATERIALNUMBER NUMBER(6) 所需食材量
SQL> select * from material;
MATERIALID MATERIALNAME REMAIN UNIT IDEALREMAIN
---------- ----------------------------------------- ------- ---------
1 土豆 1000 斤 100
2 白萝卜 1000 斤 100
3 茄子 1000 斤 100
4 黄瓜 1000斤 100
5 竹笋 1000 斤 100
6 大蒜 1000 斤 100
7 大白菜 1000 斤 100
8 辣椒 1000 斤 100
9 莲藕 1000斤 100
10 胡箩卜 1000 斤 100
11 豌豆 1000 斤 100
12 梅菜 1000 斤 100
SQL> desc material;
Name Type Nullable Default Comments
------------ ------------- -------- ------- --------
MATERIALID NUMBER(6) 食材ID
MATERIALNAME VARCHAR2(200) 食材名字
REMAIN NUMBER(6) 食材剩余量
UNIT VARCHAR2(10) 单位
IDEALREMAIN VARCHAR2(6) 理想库存
上面的表可能有点乱,bill(订单)表是订单表 ,bf(订单-食物)表是bill表跟food(食物)表对应的一个中间表 由于在此跟food关联不大所以没有把food贴上来,
fm(食物-食材)表是food(食物)表跟material(食材)表对应的一个中间表
想实现 在bill中的made字段update了一个值之后,material中对应的remain(食材剩余量)即发生相应的改变
例如:当bill中的made字段update了一个值之后,假如billuuid(订单uuid(主键))为sda
bf中对应的为
BFID BILLUUID FOODID COPIES
------- -------------------------------- -------
1 sda 1 3
2 sda 2 9
3 sda 3 1
4 sda 9 3
8 sda 5 1
bf表中的foodid所对应的fm表中的foodid为
MATERIALID MATERIALNAME REMAIN UNIT IDEALREMAIN
---------- --------------------------------------- ------- -------
1 土豆 1000 斤 100
2 白萝卜 1000 斤 100
3 茄子 1000 斤 100
4 黄瓜 1000斤 100
8 辣椒 1000 斤 100
fm表中的materiid所对应的material表中的materialid为
MATERIALID MATERIALNAME REMAIN UNIT IDEALREMAIN
---------- ------------------------------------------ ------- ---------- -----------
1 土豆 1000 斤 100
2 白萝卜 1000 斤 100
3 茄子 1000 斤 100
4黄瓜 1000斤 100
8 辣椒 1000 斤 100
material表中所对应的食材就自动减去相应的数量
这就是一个简单的客户去点菜,但菜是由不同的食材做成,厨师将菜做好之后,厨师update了MADE字段,material表对应的remain(食材剩余量)就自动减去相应的数量
我知道可以用触发器来解决,但在解决的过程中遇到了很多的问题,不知道各位能否给出代码
[解决办法]
我给你写一下,请参考,但没有编译,因为我数据库中没有对应的表结构。
- SQL code
BREATE OR REPLACE TRIGGER BillMadeUpdate AFTER UPDATE ON Bill FOR EACH ROWDECLARE CURSOR curBF(billUUID VARCHAR2(32)) IS SELECT BillUUID, FoodId, Copies FROM bf WHERE BillUUID = billUUID; CURSOR curFM(foodId NUMBER(6)) IS SELECT * FROM fm WHERE FoodId = foodId; foodId NUMBER(6); -- 菜编号 copies NUMBER(6); -- 份数 materialID NUMBER(6); -- 食材编号 materialNum NUMBER(6); -- 食材量BEGIN -- 一个订单会有多道菜 FOR r in curBF(:NEW.BillUUID) foodId = r.FoodId; copies = r.copies; -- 一道菜对应多种食材 FOR r1 IN curFM(foodId) materialID = r1.MaterialId; materialNum = r1.MaterialNum * copies; UPDATE Material SET Remain = Reamin - materialNum WHERE materialId = materialId; END Loop; END LOOP;END BillMadeUpdate;
