2017-08-14 3 views
0

Ich benutze einen Cursor und eine Schleife, um eine gespeicherte Prozedur für jedes Element einer Tabelle auszuführen. Ich brauche das einmal am Tag. Die Prozedur funktioniert und führt die tägliche Prozedur für jede Zeile der Tabelle aus. Dieser Teil funktioniert gut. Aber wenn ich versuche, am Ende eine Protokollierung hinzuzufügen (Aktualisierung der Tabelle RollupControl mit der Zeit, die diese Ausführung dauerte), wird dieser Befehl überhaupt nicht ausgeführt ... Ich habe zwei Debugging-Selects hinzugefügt, einen in der Schleife und den Anderes draußen. Die eine im Inneren ausgeführt wird aber die eine außen nicht ...In MySQL kann ich keine Befehle nach einer Schleife ausführen

DROP procedure IF EXISTS `RunX`; 
DELIMITER $$ 
CREATE PROCEDURE `RunX`() 
RunX:BEGIN 
    -- Roda Rup366 uma vez para cada Dispositivo 
    DECLARE t0 DATETIME(2) DEFAULT NOW(2); 
    DECLARE t0i FLOAT DEFAULT 0; 
    DECLARE debug INT DEFAULT 1; 

    DECLARE viddisp varchar(6); 
    DECLARE done BOOLEAN DEFAULT FALSE; 
    DECLARE _id BIGINT UNSIGNED; 

    DECLARE cur CURSOR FOR (SELECT ID FROM TableM m JOIN TableR r on m.ID = r.ID 
    WHERE TIME_TO_SEC(TIMEDIFF(LastUpdatedTime,LastQueryedTime))/(60*60*24) > 1); 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE; 

    OPEN cur; 
     RunXLoop: LOOP 
     FETCH cur INTO _id; 
     IF done THEN 
      LEAVE RunX; 
     END IF; 
     SET viddisp = (SELECT IDDisp FROM TableM WHERE ID = _id); 
     IF debug=1 THEN 
      SELECT viddisp; 
     END IF; 
     CALL RunOnceADayProc(viddisp); 
     END LOOP RunXLoop; 
    IF debug=1 THEN 
     SELECT t0i; 
    END IF; 
    SET t0i = (SELECT TIMESTAMPDIFF(MICROSECOND,t0,NOW(2))/1000000); 
    UPDATE RollupControl SET DH_Op = NOW(), ET = t0i WHERE ID = 366; 
    CLOSE cur; 

END$$ 
DELIMITER ; 

Antwort

1

ich

denke
LEAVE RunX; 

sollte

LEAVE RunXLoop; 
Verwandte Themen