sql >> Base de Datos >  >> RDS >> Mysql

Llame a un procedimiento almacenado para cada fila devuelta por una consulta en MySQL

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