While creating a more complex stored procedure in MySQL, I encountered a weird problem with my CASE statement. I have simplified my procedure to show the issue. I am selecting three things per loop to clarify the problem: the count
variable, the modTemp
variable before the CASE, and then a number representing which CASE path was taken.
DELIMITER //
CREATE PROCEDURE `AddPlants` (IN plantNum int)
BEGIN
DECLARE count int;
DECLARE modTemp int;
SET count = 1;
WHILE count <= plantNum DO
SELECT CONCAT('count = ', count);
SET modTemp = count % 3;
SELECT CONCAT('modTemp = ', modTemp);
CASE modTemp
WHEN modTemp = 1 THEN
SELECT 1;
WHEN modTemp = 2 THEN
SELECT 2;
WHEN modTemp = 0 THEN
SELECT 3;
ELSE
SELECT CONCAT('Error: modTemp = ', modTemp);
END CASE;
SET count = count + 1;
END WHILE;
END//
Now I use CALL AddPlants(3);
Here are my results:
Expected output
count = 1, modTemp = 1, 1
count = 2, modTemp = 2, 2
count = 3, modTemp = 0, 3
Actual output
count = 1, modTemp = 1, 1
count = 2, modTemp = 2, Error: modTemp = 2
count = 3, modTemp = 0, 1
Each time, count and modTemp are the correct values. However, on the second loop, modTemp is 2 but does not enter CASE 2. And in the third loop, modTemp is 0 but goes into CASE 1. Any ideas what is happening here?