Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Chame um procedimento armazenado para cada linha retornada por uma consulta no MySQL


Conceitos como “loops” (for-each, while, etc) e “branching” (if-else, call, etc) são procedural e não existem em declarativo linguagens como SQL. Normalmente pode-se expressar o resultado desejado de forma declarativa, que seria a forma correta de resolver este problema.

Por exemplo, se o testProc procedimento que deve ser chamado usa o id fornecido como uma chave de pesquisa em outra tabela, então você pode (e deve) simplesmente JOIN suas tabelas juntas—por exemplo:
SELECT ...
FROM   objects JOIN other USING (id)
WHERE  ...

Somente nas situações extremamente raras em que seu problema não pode ser expresso declarativamente, você deve recorrer a resolvê-lo processualmente. procedimentos armazenados são a única maneira de executar código procedural no MySQL. Portanto, você precisa modificar seu sproc existente para que ele execute sua lógica atual em um loop ou criar um novo sproc que chame o existente de dentro de um loop:
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