sql >> Databáze >  >> RDS >> Mysql

Volejte uloženou proceduru pro každý řádek vrácený dotazem v MySQL

Pojmy jako „smyčky“ (pro-each, while atd.) a „větvení“ (if-else, call atd.) jsou procedurální a neexistují v deklarativním jazyky jako SQL. Obvykle lze požadovaný výsledek vyjádřit deklarativním způsobem, což by byl správný způsob, jak tento problém vyřešit.

Například pokud testProc procedura, která má být volána, používá dané id jako vyhledávací klíč do jiné tabulky, pak byste mohli (a měli byste) místo toho jednoduše JOIN vaše stoly dohromady – například:

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

Pouze v extrémně vzácných situacích, kdy váš problém nelze vyjádřit deklarativně, byste se měli uchýlit k jeho řešení procedurálně. Uložené postupy jsou jediným způsobem, jak spustit procedurální kód v MySQL. Takže musíte buď upravit svůj stávající sproc tak, aby vykonával svou aktuální logiku v rámci smyčky, nebo vytvořit nový sproc, který volá váš stávající ze smyčky:

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. MySQL získá pozici řádku v ORDER BY

  2. Jak zjistit, která verze Postgres je spuštěna

  3. Funkce TAN() v Oracle

  4. Jak zakážu referenční integritu v Postgres 8.2?