DECLARE  done INT DEFAULT 0;
DECLARE  v_OrderID int ;
DECLARE  v_InQuant decimal(18,8);
DECLARE  v_OutQuant decimal(18,8);
DECLARE  v_InValue decimal(18,8);
DECLARE  v_OutValue decimal(18,8);
DECLARE  v_CurQuant decimal(18,8);
DECLARE  v_CurValue decimal(18,8);
DECLARE  v_CurQuants decimal(18,8);
DECLARE  v_CurValues decimal(18,8);
DECLARE  v_ID int ;
DECLARE curPeriod CURSOR FOR SELECT id,OrderID,InQuant,InValue,OutQuant,OutValue,CurQuant,CurValue
FROM Tem_InvValBalAccountMx WHERE  OrderID<>0 ORDER BY MaterialID, BatchID,OrderID,GoodsMovementID;
Open curPeriod;
Repeat
Fetch curPeriod INTO v_ID,v_OrderID,v_InQuant,v_InValue,v_OutQuant,v_OutValue,v_CurQuant,v_CurValue;
IF done<>1 THEN
IF v_OrderID=1 THEN /*期初值*/
SET v_CurQuants=v_CurQuant;
SET v_CurValues=v_CurValue;
ELSE /*单据值*/
SET v_CurQuants=v_CurQuants+v_InQuant-v_OutQuant;
SET v_CurValues=v_CurQuants+v_InValue-v_OutValue;
UPDATE Tem_InvValBalAccountMx 
SET CurQuant=v_CurQuants,CurValue=v_CurValues
WHERE id=v_ID;
END IF ;
END IF ;
Until done=1 END Repeat;
CLOSE curPeriod;查询的表是临时表,其中有数据
CREATE TEMPORARY TABLE IF NOT EXISTS Tem_InvValBalAccountMx(
id mediumint not null auto_increment,
MaterialID int NOT NULL default 0/*物料id*/,
BatchID int NOT NULL default 0/*批次id*/,
OrderID int NOT NULL default 0/*排序id*/,
GoodsMovementID int NOT NULL default 0/*单据id*/,
IsRed char(1) default '0' not null/*是否红单, 1 是 0 不是*/,
MOVETYPETYPE char(1) NOT NULL default ''/*移动类型*/,
BillCode varchar(60) NOT NULL default ''/*单据编号*/,
MovetypeName varchar(100) NOT NULL default ''/*业务类型*/,
BillDate date   /*制单日期*/,
UnitID varchar(60) NOT NULL default ''/*单位*/,
InQuant decimal(18,8) NOT NULL default 0/*收入数量*/,
InPrice decimal(18,8) NOT NULL default 0/*收入价格*/,
InValue decimal(18,8) NOT NULL default 0/*收入金额*/,
OutQuant decimal(18,8) NOT NULL default 0/*发出数量*/,
OutPrice decimal(18,8) NOT NULL default 0/*发出价格*/,
OutValue decimal(18,8) NOT NULL default 0/*发出金额*/,
CurQuant decimal(18,8) NOT NULL default 0/*结存数量*/,
CurPrice decimal(18,8) NOT NULL default 0/*结存价格*/,
CurValue decimal(18,8) NOT NULL default 0/*结存金额*/,
primary key (id));

解决方案 »

  1.   

    加上 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 就可以了,呵呵。
      

  2.   

    Until done=1 END Repeat; 
    你在哪改变的done 呢?!
    DECLARE curPeriod CURSOR FOR SELECT id,OrderID,InQuant,InValue,OutQuant,OutValue,CurQuant,CurValue 
    FROM Tem_InvValBalAccountMx WHERE  OrderID <>0 ORDER BY MaterialID, BatchID,OrderID,GoodsMovementID; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;   #-- changed by ACMAINOpen curPeriod;