Begrippen zoals "loops" (for-each, while, etc) en "branching" (if-else, call, etc) zijn procedureel en bestaan niet in declaratief talen zoals SQL. Meestal kan men het gewenste resultaat op een declaratieve manier uitdrukken, wat de juiste manier zou zijn om dit probleem op te lossen.
Als bijvoorbeeld de testProc
procedure die moet worden aangeroepen, gebruikt de opgegeven id
als een opzoeksleutel in een andere tabel, dan kunt (en moet) u in plaats daarvan eenvoudig JOIN
uw tafels samen, bijvoorbeeld:
SELECT ...
FROM objects JOIN other USING (id)
WHERE ...
Alleen in de uiterst zeldzame situaties waarin uw probleem niet declaratief kan worden uitgedrukt, moet u het in plaats daarvan procedureel oplossen. Opgeslagen procedures zijn de enige manier om procedurele code in MySQL uit te voeren. Je moet dus ofwel je bestaande sproc aanpassen zodat deze zijn huidige logica binnen een lus uitvoert, of je moet een nieuwe sproc maken die je bestaande sproc aanroept vanuit een lus:
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