Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Rufen Sie eine gespeicherte Prozedur für jede Zeile auf, die von einer Abfrage in MySQL zurückgegeben wird

Konzepte wie „Schleifen“ (for-each, while usw.) und „Verzweigungen“ (if-else, call usw.) sind prozedural und existieren nicht in deklarativ Sprachen wie SQL. Normalerweise kann man sein gewünschtes Ergebnis deklarativ ausdrücken, was der richtige Weg zur Lösung dieses Problems wäre.

Wenn beispielsweise die Datei testProc Prozedur, die aufgerufen werden soll, verwendet die angegebene id als Nachschlageschlüssel in eine andere Tabelle, dann könnten (und sollten) Sie stattdessen einfach JOIN Ihre Tabellen zusammen – zum Beispiel:

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

Nur in den äußerst seltenen Situationen, in denen Ihr Problem nicht deklarativ formuliert werden kann, sollten Sie stattdessen auf eine prozedurale Lösung zurückgreifen. Gespeicherte Prozeduren sind die einzige Möglichkeit, prozeduralen Code in MySQL auszuführen. Sie müssen also entweder Ihren vorhandenen Sproc so ändern, dass er seine aktuelle Logik innerhalb einer Schleife ausführt, oder Sie müssen einen neuen Sproc erstellen, der Ihren vorhandenen Sproc innerhalb einer Schleife aufruft:

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