Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Usando o conjunto de resultados SELECT para executar a consulta UPDATE com os procedimentos armazenados do 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 ;

Obs:não testei. É possível que o MySQL não goste de UPDATE em uma tabela para a qual atualmente tenha um cursor aberto.

PS:Você deve reconsiderar como você está armazenando senhas .

Re comentar sobre RETURN vs. OUT vs. conjunto de resultados:

RETURN é usado apenas em funções armazenadas, não em procedimentos armazenados. As funções armazenadas são usadas quando você deseja chamar a rotina em outra expressão SQL.
SELECT LCASE( checkUserFunc(?, ?) );

Você pode usar um OUT parâmetro, mas você precisa declarar uma variável de usuário primeiro para passar como esse parâmetro. E então você tem que selecionar essa variável de usuário para obter seu valor de qualquer maneira.
SET @outparam = null;
CALL checkUser(?, ?, @outparam);
SELECT @outparam;

Ao retornar conjuntos de resultados de um procedimento armazenado, é mais fácil usar um SELECT consulta.