BEGIN  DECLARE v_CkQD_Pn varchar(30); 
declare v_CkQD_Sl bigint; 
declare stopFlag int; 
declare v_Rk_Sl bigint; 
DECLARE cursor_ckqd CURSOR  
FOR select Pn,Sl from CkQD; 
DECLARE CONTINUE HANDLER FOR NOT FOUND set stopFlag=1;  
insert into ck(select ckqd.* from ckqd,rk where ckqd.Pn = rk.Pn and ckqd.Sl <= rk.Sl and ckqd.ph=rk.ph);
OPEN cursor_ckqd; 
REPEAT FETCH cursor_ckqd INTO v_CkQD_Pn,v_CkQD_Sl;    
begin    
if (stopFlag is null) then        
select ckqd.* from ckqd,rk where ckqd.Pn = rk.Pn and ckqd.Sl <= rk.Sl and ckqd.ph=rk.ph;    
if (v_CkQD_Sl <= v_Rk_Sl) then  
delete from CkQD where pn = v_CkQD_Pn;          
update Rk set Sl = v_Rk_Sl - v_CkQD_Sl where pn = v_CkQD_Pn;         
end if;    
end if;     
end; 
UNTIL stopFlag = 1 END REPEAT; 
CLOSE cursor_ckqd;
END表结构如下
入库表(Rk)
| Id | Pn  | Gz  | Lb   | Dw | Sl | Jj   | Lj | Ph | Rt | Qx  | Cj   | Bz
出库清单(Ckqd)
| Id | Pn | Gz | Dw  | Lb | Sl | Jj | Lj | Ph  | Ckf | Ckt | Jlr | chr  | Cj | Bz  |
出库表和清单结构一样,只要出库清单的物品只要是RK的PH(批号)相同的,就插入到CK表再删除CKQD表中的行,并在RK表中减去出库商品的数量(SL)
现在是过程执行插入到Ck表后,就不动了以后的RK表的数量也没有减,Ckqd也没有删   

解决方案 »

  1.   

    打印出来v_CkQD_Sl, v_Rk_Sl看看是否满足if语句
      

  2.   

    注意你的 select ckqd.* from ckqd,rk where ckqd.P
    delete from CkQD where pn = v_CkQD_Pn;          
    update Rk set Sl = v_Rk_Sl - v_CkQD_Sl where pn = v_CkQD_Pn;   
    均会导致
    DECLARE CONTINUE HANDLER FOR NOT FOUND set stopFlag=1;利用中间变量保存一下 stopFlag 的状态。
      

  3.   

    ...
    set  stopFlag=0;
    UNTIL stopFlag = 1 END REPEAT; 
      

  4.   

    通才下贴中与你相同的问题及解决方案。
    http://bbs.csdn.net/topics/390339534
      

  5.   

    BEGIN  
    DECLARE v_CkQD_Pn varchar(30); 
    declare v_CkQD_Sl bigint; 
    declare stopFlag int; 
    declare v_Rk_Sl bigint; 
    DECLARE cursor_ckqd CURSOR  
    FOR select Pn,Sl from CkQD; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND set stopFlag=1;  
    OPEN cursor_ckqd; 
    REPEAT 
    FETCH cursor_ckqd INTO v_CkQD_Pn,v_CkQD_Sl;     select Sl into v_Rk_Sl from Rk where Ph=v_CkQD_Pn  and sl>=v_CkQD_Sl;
    if v_Rk_Sl>0 then
    insert into Ck select * from CkQD where Ph=v_CkQD_Pn;
    delete from CkQD where pn = v_CkQD_Pn;          
    update Rk set Sl = Sl - v_CkQD_Sl where pn = v_CkQD_Pn; 
    end if;     UNTIL stopFlag = 1 END REPEAT; 
    CLOSE cursor_ckqd;
    END