关于减去材料的有关问题 的请问

关于减去材料的问题 的请教最近实习做了一个项目:餐厅系统,要求实现基本的餐厅功能,但在设计数据库的时候

关于减去材料的问题 的请教
最近实习做了一个项目:餐厅系统,要求实现基本的餐厅功能,但在设计数据库的时候遇到了如下困难:

有关数据库如下:
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;