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 :je n'ai pas testé. Il est possible que MySQL n'aime pas UPDATE sur une table pour laquelle un curseur est actuellement ouvert.
PS :Vous devriez reconsidérer la façon dont vous stockez les mots de passe .
Re commentaire sur RETURN
vs OUT
par rapport à l'ensemble de résultats :
RETURN
est utilisé uniquement dans les fonctions stockées, pas dans les procédures stockées. Les fonctions stockées sont utilisées lorsque vous souhaitez appeler la routine dans une autre expression SQL.
SELECT LCASE( checkUserFunc(?, ?) );
Vous pouvez utiliser un OUT
paramètre, mais vous devez d'abord déclarer une variable utilisateur pour passer en tant que paramètre. Et ensuite, vous devez sélectionner cette variable utilisateur pour obtenir sa valeur de toute façon.
SET @outparam = null;
CALL checkUser(?, ?, @outparam);
SELECT @outparam;
Lors du retour de jeux de résultats à partir d'une procédure stockée, il est plus facile d'utiliser un SELECT
requête.