Les concepts tels que les "boucles" (for-each, while, etc.) et les "branchements" (if-else, call, etc.) sont procéduraux et n'existent pas en déclaratif des langages comme SQL. Habituellement, on peut exprimer le résultat souhaité de manière déclarative, ce qui serait la bonne façon de résoudre ce problème.
Par exemple, si le testProc
la procédure à appeler utilise le id
donné comme clé de recherche dans une autre table, alors vous pourriez (et devriez) à la place simplement JOIN
vos tables ensemble, par exemple :
SELECT ...
FROM objects JOIN other USING (id)
WHERE ...
Ce n'est que dans les situations extrêmement rares où votre problème ne peut pas être exprimé de manière déclarative que vous devriez alors recourir à une résolution procédurale. Procédures stockées sont le seul moyen d'exécuter du code procédural dans MySQL. Vous devez donc soit modifier votre sproc existant pour qu'il exécute sa logique actuelle dans une boucle, soit créer un nouveau sproc qui appelle votre sproc existant à partir d'une boucle :
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