sql >> Database >  >> RDS >> Mysql

Roep een opgeslagen procedure aan voor elke rij die wordt geretourneerd door een query in MySQL

Begrippen zoals "loops" (for-each, while, etc) en "branching" (if-else, call, etc) zijn procedureel en bestaan ​​niet in declaratief talen zoals SQL. Meestal kan men het gewenste resultaat op een declaratieve manier uitdrukken, wat de juiste manier zou zijn om dit probleem op te lossen.

Als bijvoorbeeld de testProc procedure die moet worden aangeroepen, gebruikt de opgegeven id als een opzoeksleutel in een andere tabel, dan kunt (en moet) u in plaats daarvan eenvoudig JOIN uw tafels samen, bijvoorbeeld:

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

Alleen in de uiterst zeldzame situaties waarin uw probleem niet declaratief kan worden uitgedrukt, moet u het in plaats daarvan procedureel oplossen. Opgeslagen procedures zijn de enige manier om procedurele code in MySQL uit te voeren. Je moet dus ofwel je bestaande sproc aanpassen zodat deze zijn huidige logica binnen een lus uitvoert, of je moet een nieuwe sproc maken die je bestaande sproc aanroept vanuit een lus:

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. Waarom is jdbcTemplate.batchUpdate() van Spring zo traag?

  2. Ontleden SELECT-clausule van SQL-query's in een PHP-array

  3. Hoe kan VBA verbinding maken met de MySQL-database in Excel?

  4. Hoe deze vreemde karakters te converteren? (ë, Ã, ì, ù, Ã)