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.
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. –
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. –
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