sql >> Databasteknik >  >> RDS >> Mysql

Anropa en lagrad procedur för varje rad som returneras av en fråga i MySQL

Begrepp som "loopar" (för varje, medan, etc) och "förgrening" (if-else, call, etc) är procedurmässiga och finns inte i deklarativ språk som SQL. Vanligtvis kan man uttrycka sitt önskade resultat på ett deklarativt sätt, vilket skulle vara det korrekta sättet att lösa detta problem.

Till exempel, om testProc proceduren som ska anropas använder det givna id som en uppslagsnyckel till en annan tabell, då kan (och borde) du istället helt enkelt JOIN dina tabeller tillsammans – till exempel:

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

Endast i de ytterst sällsynta situationer där ditt problem inte kan uttryckas på ett deklarativt sätt bör du istället ta till att lösa det procedurmässigt. Lagrade procedurer är det enda sättet att exekvera procedurkod i MySQL. Så du måste antingen modifiera din befintliga sproc så att den utför sin nuvarande logik i en loop, eller så måste du skapa en ny sproc som anropar din befintliga från en 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



  1. Rails-utveckling - Kan inte ansluta till MySQL-server på 'localhost' (10061)

  2. SQL LIKE % inuti array

  3. Begränsa en vänsterkoppling till att returnera ett resultat?

  4. Hur man beräknar rang i MySQL