Begreber som "loops" (for-each, while osv.) og "branching" (if-else, call osv.) er proceduremæssige og eksisterer ikke i deklarativ sprog som SQL. Normalt kan man udtrykke sit ønskede resultat på en deklarativ måde, hvilket ville være den korrekte måde at løse dette problem på.
For eksempel, hvis testProc
procedure, der skal kaldes, bruger det givne id
som en opslagsnøgle til en anden tabel, så kunne (og burde) du i stedet blot JOIN
dine borde sammen – for eksempel:
SELECT ...
FROM objects JOIN other USING (id)
WHERE ...
Kun i de yderst sjældne situationer, hvor dit problem ikke kan udtrykkes deklarativt, bør du så ty til at løse det proceduremæssigt i stedet. Gemte procedurer er den eneste måde at udføre procedurekode i MySQL. Så du skal enten ændre din eksisterende sproc, så den udfører sin nuværende logik i en loop, eller også oprette en ny sproc, der kalder din eksisterende inde fra en loop:
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