Mysql
 sql >> Base de données >  >> RDS >> Mysql

Appelez une procédure stockée pour chaque ligne renvoyée par une requête dans MySQL

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