Mysql
 sql >> Base de données >  >> RDS >> Mysql

Utilisation du jeu de résultats SELECT pour exécuter la requête UPDATE avec les procédures stockées MySQL

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.