Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wywołaj procedurę składowaną dla każdego wiersza zwróconego przez zapytanie w MySQL

Pojęcia takie jak „pętle” (for-each, while itp.) i „rozgałęzienia” (if-else, call itp.) są proceduralne i nie istnieją w deklaratywnym języki takie jak SQL. Zwykle można wyrazić pożądany wynik w sposób deklaratywny, co byłoby właściwym sposobem rozwiązania tego problemu.

Na przykład, jeśli testProc procedura, która ma zostać wywołana, używa podanego id jako klucz wyszukiwania do innej tabeli, możesz (i powinieneś) zamiast tego po prostu JOIN Twoje stoły razem — na przykład:

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

Tylko w skrajnie rzadkich sytuacjach, w których problemu nie można wyrazić deklaratywnie, należy zamiast tego uciekać się do rozwiązania go proceduralnie. Przechowywane procedury są jedynym sposobem wykonania kodu proceduralnego w MySQL. Musisz więc albo zmodyfikować istniejący sproc, aby wykonywał swoją obecną logikę w pętli, albo utworzyć nowy sproc, który wywołuje istniejący z wewnątrz pętli:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PDO Nie można wykonywać zapytań, gdy inne niebuforowane zapytania są aktywne

  2. Jak mogę przebudować indeksy i zaktualizować statystyki w MySQL innoDB?

  3. SQLite w Androidzie:oczekiwano kluczy obcych i <ograniczenie tabeli>

  4. Wyzwalacz MySQL:aktualizacja po osiągnięciu określonej daty i godziny

  5. Laravel - Nieprawidłowy numer parametru:parametr nie został zdefiniowany