Pojmy jako „smyčky“ (pro-each, while atd.) a „větvení“ (if-else, call atd.) jsou procedurální a neexistují v deklarativním jazyky jako SQL. Obvykle lze požadovaný výsledek vyjádřit deklarativním způsobem, což by byl správný způsob, jak tento problém vyřešit.
Například pokud testProc
procedura, která má být volána, používá dané id
jako vyhledávací klíč do jiné tabulky, pak byste mohli (a měli byste) místo toho jednoduše JOIN
vaše stoly dohromady – například:
SELECT ...
FROM objects JOIN other USING (id)
WHERE ...
Pouze v extrémně vzácných situacích, kdy váš problém nelze vyjádřit deklarativně, byste se měli uchýlit k jeho řešení procedurálně. Uložené postupy jsou jediným způsobem, jak spustit procedurální kód v MySQL. Takže musíte buď upravit svůj stávající sproc tak, aby vykonával svou aktuální logiku v rámci smyčky, nebo vytvořit nový sproc, který volá váš stávající ze smyčky:
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