DELIMITER //
CREATE PROCEDURE checkUser(IN in_email VARCHAR(80), IN in_password VARCHAR(50))
BEGIN
DECLARE tempId INT DEFAULT 0;
DECLARE tempName VARCHAR(50) DEFAULT NULL;
DECLARE done INT DEFAULT 0;
DECLARE cur CURSOR FOR
SELECT id, name FROM users WHERE email = in_email AND password = in_password;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
REPEAT
FETCH cur INTO tempId, tempName;
UPDATE users SET online = 1 WHERE id = tempId;
UNTIL done = 1 END REPEAT;
CLOSE cur;
SELECT tempName;
END //
DELIMITER ;
NB:Не съм тествал това. Възможно е MySQL да не харесва UPDATE спрямо таблица, за която в момента има отворен курсор.
PS:Трябва да преразгледате как съхранявате пароли .
Повторете коментар относно RETURN
срещу OUT
спрямо набор от резултати:
RETURN
се използва само в съхранени функции, а не в съхранени процедури. Съхранените функции се използват, когато искате да извикате подпрограмата в друг SQL израз.
SELECT LCASE( checkUserFunc(?, ?) );
Можете да използвате OUT
параметър, но първо трябва да декларирате потребителска променлива, която да премине като този параметър. И тогава трябва да изберете тази потребителска променлива, за да получите стойността й.
SET @outparam = null;
CALL checkUser(?, ?, @outparam);
SELECT @outparam;
Когато връщате набори от резултати от съхранена процедура, най-лесно е да използвате SELECT
запитване.