2013-02-14 55 views
2

如何在同一例程中使用两个游标?我在创建过程时遇到“游标或处理程序声明后的变量或条件声明”错误。 我必须使用整数outerDone & innerDone来检查游标是否指向null。 我还没有处理存储过程。请问任何人都可以解决这个问题。提前致谢!!在存储过程中处理多个嵌套游标

DELIMITER ##; 
create procedure updateStopTimeColumn() 
BEGIN 
DECLARE outerDone INT DEFAULT 0; 
DECLARE vehicle_record CURSOR FOR SELECT `vehicleId` FROM `vehicle`; 
DECLARE current_record CURSOR FOR SELECT `id`,`tsTime`,`teTime` FROM `trip` where `vehicleId`=vehId order by `tsTime`; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET outerDone = 1; 
DECLARE vehId,tripId CHAR(250); 
DECLARE currentTsTime,currentTeTime time; 

OPEN vehicle_record; 
REPEAT 
    FETCH vehicle_record INTO vehId; 


block2 : BEGIN 
    DECLARE innerDone INT DEFAULT 0; 
    DECLARE tempTripId CHAR(250); 
    DECLARE tempTsTime,tempTeTime time; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET innerDone = 1; 

    OPEN current_record; 

    FETCH current_record INTO tempTripId, tempTsTime,tempTeTime; 

    REPEAT 
     FETCH current_record INTO tripId,currentTsTime,currentTeTime; 
     UPDATE trip set stopTime=(currentTeTime-tempTsTime) where id=tempTripId and tempTeTime IS NOT NULL; 

     SET tempTripId=tempId; 
     SET tempTsTime=currentTsTime; 
     SET tempTeTime=currentTeTime; 

    UNTIL innerDone END REPEAT; 
END block2; 
CLOSE current_record; 
UNTIL outerDone END REPEAT; 

CLOSE vehicle_record; 
END; ## 
DELIMITER; 
+0

如果可能,您是否可以为您的问题创建SQL小提琴[http://sqlfiddle.com/](http://sqlfiddle.com/)?它只是使测试解决方案变得更容易。 – neelsg 2013-02-14 21:18:03

回答

0

您是否尝试过你的光标移动之前的

DECLARE vehId,tripId CHAR(250); 
DECLARE currentTsTime,currentTeTime time; 

报表?