Konzepte wie „Schleifen“ (for-each, while usw.) und „Verzweigungen“ (if-else, call usw.) sind prozedural und existieren nicht in deklarativ Sprachen wie SQL. Normalerweise kann man sein gewünschtes Ergebnis deklarativ ausdrücken, was der richtige Weg zur Lösung dieses Problems wäre.
Wenn beispielsweise die Datei testProc
Prozedur, die aufgerufen werden soll, verwendet die angegebene id
als Nachschlageschlüssel in eine andere Tabelle, dann könnten (und sollten) Sie stattdessen einfach JOIN
Ihre Tabellen zusammen – zum Beispiel:
SELECT ...
FROM objects JOIN other USING (id)
WHERE ...
Nur in den äußerst seltenen Situationen, in denen Ihr Problem nicht deklarativ formuliert werden kann, sollten Sie stattdessen auf eine prozedurale Lösung zurückgreifen. Gespeicherte Prozeduren sind die einzige Möglichkeit, prozeduralen Code in MySQL auszuführen. Sie müssen also entweder Ihren vorhandenen Sproc so ändern, dass er seine aktuelle Logik innerhalb einer Schleife ausführt, oder Sie müssen einen neuen Sproc erstellen, der Ihren vorhandenen Sproc innerhalb einer Schleife aufruft:
CREATE PROCEDURE foo() BEGIN
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE _id BIGINT UNSIGNED;
DECLARE cur CURSOR FOR SELECT id FROM objects WHERE ...;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;
OPEN cur;
testLoop: LOOP
FETCH cur INTO _id;
IF done THEN
LEAVE testLoop;
END IF;
CALL testProc(_id);
END LOOP testLoop;
CLOSE cur;
END