2017-12-06 4 views
0

Ich versuche, eine Cursor-Schleife in einer gespeicherten Prozedur mit diesem Skript auszuführen:MySQL Syntaxfehler in der Cursor-Schleife

CREATE PROCEDURE migrateMStruct() 
BEGIN 
DECLARE finished INT DEFAULT FALSE; 
DECLARE msId BIGINT(20) UNSIGNED; 
DECLARE luId INT(11); 

DECLARE msCursor CURSOR FOR 
    SELECT id, live_unit_id FROM mounting_structures 
    WHERE live_unit_id IS NOT NULL; 

DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = TRUE; 

OPEN msCursor; 

read_loop: LOOP 
    FETCH msCursor INTO msId, luId; 
    IF finished THEN 
     LEAVE read_loop; 
    END IF; 
    UPDATE live_units SET mountingStructureId = msId WHERE live_units.id = luId; 
END LOOP; 

CLOSE msCursor; 
END; 

ich dieses Skript auf der MySQL-Dokumentation basiert geschrieben, aber wenn das Skript ausführen ich bin den Fehler zu erhalten:

SQL Error [1064] [42000]: You have an error in your SQL syntax; check the manual 
that corresponds to your MySQL server version for the right syntax to use near '' 
at line 19 

Linie 19 ist nur die END IF; Aussage. Offensichtlich nicht der hilfreichste Fehler in der Welt, aber basierend auf der MySQL-Dokumentation scheint die Syntax korrekt zu sein.

+0

Warum nicht einen einfache 'UPDATE verwenden gefunden live_units INNER mounting_structures ON live_units.id JOIN = mounting_structures.live_unit_id SET live_units.mountingStructureId = mounting_structures.id WHERE mounting_structures.live_unit_id IST NICHT NULL' ?? dann müssen Sie keinen CURSOR verwenden. –

+0

Das scheint die Arbeit zu erledigen, danke. Mein Kollege schien zu denken, dass ich einen Cursor verwenden müsste. Ich bin immer noch neugierig, was mit meiner Syntax nicht stimmt, aber zumindest tut das, was ich brauche. –

+0

Verwenden Sie den Befehl 'delimiter', siehe [23.1 Definieren gespeicherter Programme] (https://dev.mysql.com/doc/refman/5.7/en/stored-programs-defining.html). – wchiquito

Antwort

0

ich den gleichen Fehler erhalten, müssen Sie das Trennzeichen vorübergehend zu verhindern, die Ausführung zu ändern, wenn die SQL-Interpreter ein Semikolon ;

DELIMITER $$ 

CREATE PROCEDURE migrateMStruct() 
BEGIN 

    /*your procedure body*/ 

END$$ 

DELIMITER ; /*back to previous delimiter*