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

Kald en lagret procedure for hver række, der returneres af en forespørgsel i MySQL

Begreber som "loops" (for-each, while osv.) og "branching" (if-else, call osv.) er proceduremæssige og eksisterer ikke i deklarativ sprog som SQL. Normalt kan man udtrykke sit ønskede resultat på en deklarativ måde, hvilket ville være den korrekte måde at løse dette problem på.

For eksempel, hvis testProc procedure, der skal kaldes, bruger det givne id som en opslagsnøgle til en anden tabel, så kunne (og burde) du i stedet blot JOIN dine borde sammen – for eksempel:

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

Kun i de yderst sjældne situationer, hvor dit problem ikke kan udtrykkes deklarativt, bør du så ty til at løse det proceduremæssigt i stedet. Gemte procedurer er den eneste måde at udføre procedurekode i MySQL. Så du skal enten ændre din eksisterende sproc, så den udfører sin nuværende logik i en loop, eller også oprette en ny sproc, der kalder din eksisterende inde fra 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. Hvordan tvinges pascal-sag med Oracles Entity Framework-understøttelse?

  2. MySQL-understrengsudtrækning ved hjælp af afgrænser

  3. Hvorfor kan Java ikke oprette forbindelse til MySQL 5.7 efter den seneste JDK-opdatering, og hvordan skal det rettes? (ssl.SSLHandshakeException:Ingen passende protokol)

  4. Hvordan vælger man fra objekttypekolonne i Oracle 11g?