Mysql
 sql >> Database >  >> RDS >> Mysql

Chiama una stored procedure per ogni riga restituita da una query in MySQL

Concetti come "loop" (for-each, while, ecc.) e "branching" (if-else, call, ecc.) sono procedurali e non esistono in dichiarativo linguaggi come SQL. Di solito si può esprimere il risultato desiderato in modo dichiarativo, che sarebbe il modo corretto per risolvere questo problema.

Ad esempio, se il testProc la procedura che deve essere chiamata usa il dato id come chiave di ricerca in un'altra tabella, quindi potresti (e dovresti) invece semplicemente JOIN le tue tabelle insieme, ad esempio:

SELECT ...
FROM   objects JOIN other USING (id)
WHERE  ...

Solo nelle situazioni estremamente rare in cui il tuo problema non può essere espresso in modo dichiarativo dovresti poi ricorrere a risolverlo proceduralmente. procedure memorizzate sono l'unico modo per eseguire codice procedurale in MySQL. Quindi devi modificare il tuo sproc esistente in modo che esegua la sua logica corrente all'interno di un ciclo, oppure creare un nuovo sproc che chiami quello esistente all'interno di un ciclo:

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