「ループ」(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