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