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:non l'ho testato. È possibile che a MySQL non piaccia UPDATE rispetto a una tabella per la quale ha attualmente un cursore aperto.
PS:dovresti riconsiderare come stai memorizzando le password .
Commento su RETURN
rispetto a OUT
rispetto al set di risultati:
RETURN
viene utilizzato solo nelle funzioni memorizzate, non nelle procedure memorizzate. Le funzioni memorizzate vengono utilizzate quando si desidera chiamare la routine all'interno di un'altra espressione SQL.
SELECT LCASE( checkUserFunc(?, ?) );
Puoi usare un OUT
parametro, ma devi prima dichiarare una variabile utente per passare come parametro. E poi devi selezionare quella variabile utente per ottenere comunque il suo valore.
SET @outparam = null;
CALL checkUser(?, ?, @outparam);
SELECT @outparam;
Quando si restituiscono set di risultati da una procedura memorizzata, è più semplice utilizzare un SELECT
interrogazione.