我想要一个有效的MySQL存储过程:
foreach id in (SELECT id FROM objects WHERE ... ) CALL testProc(id)
我想我只是希望MySQL回答这个问题,但我不太了解游标:How do I execute a stored procedure once for each row returned by query?
答案 0 :(得分:39)
诸如“循环”(for-each,while等)和“分支”(if-else,call等)之类的概念是过程,并且不存在于声明性< / em>像SQL这样的语言。通常人们可以用声明的方式表达一个人想要的结果,这将是解决这个问题的正确方法。
例如,如果要调用的testProc
过程使用给定的id
作为查找键到另一个表中,那么您可以(而且应该)只需JOIN
表格在一起 - 例如:
SELECT ...
FROM objects JOIN other USING (id)
WHERE ...
只有在非常罕见的情况下,如果您无法以声明方式表达您的问题,那么您应该尝试以程序方式解决问题。存储的过程是在MySQL中执行过程代码的唯一方法。因此,您需要修改现有的sproc,以便它在循环中执行其当前逻辑,或者创建一个新的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