Conceptos como "bucles" (for-each, while, etc.) y "branching" (if-else, call, etc.) son procedimiento y no existen en declarative lenguajes como SQL. Por lo general, uno puede expresar el resultado deseado de forma declarativa, que sería la forma correcta de resolver este problema.
Por ejemplo, si testProc
el procedimiento que se va a llamar usa el id
dado como una clave de búsqueda en otra tabla, entonces podría (y debería) simplemente JOIN
sus mesas juntas, por ejemplo:
SELECT ...
FROM objects JOIN other USING (id)
WHERE ...
Solo en las situaciones extremadamente raras en las que su problema no se puede expresar de manera declarativa, debe recurrir a resolverlo de manera procesal. procedimientos almacenados son la única forma de ejecutar código de procedimiento en MySQL. Entonces, debe modificar su sproc existente para que realice su lógica actual dentro de un bucle, o bien crear un nuevo sproc que llame a su existente desde dentro de un bucle:
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