Понятия като „цикли“ (for-each, while и т.н.) и „разклоняване“ (if-else, call и т.н.) са процедурни и не съществуват в декларативно езици като SQL. Обикновено човек може да изрази желания резултат по декларативен начин, което би било правилният начин за решаване на този проблем.
Например, ако testProc
процедурата, която трябва да бъде извикана, използва дадения id
като ключ за търсене в друга таблица, тогава бихте могли (и трябва) вместо това просто JOIN
вашите таблици заедно – например:
SELECT ...
FROM objects JOIN other USING (id)
WHERE ...
Само в изключително редките ситуации, когато проблемът ви не може да бъде изразен декларативно, трябва да прибягвате до процедурно разрешаване. Съхранени процедури са единственият начин за изпълнение на процедурен код в MySQL. Така че или трябва да модифицирате съществуващия си sproc, така че да изпълнява текущата си логика в рамките на цикъл, или да създадете нов sproc, който извиква съществуващия ви от цикъл:
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