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: Вам следует пересмотреть как вы храните пароли .
Re комментарий о RETURN
против OUT
против набора результатов:
RETURN
используется только в хранимых функциях, а не в хранимых процедурах. Хранимые функции используются, когда вы хотите вызвать подпрограмму в другом выражении SQL.
SELECT LCASE( checkUserFunc(?, ?) );
Вы можете использовать параметр OUT
, но вы должны сначала объявить пользовательскую переменную, чтобы передать в качестве этого параметра. И затем вы должны выбрать эту переменную пользователя, чтобы получить ее значение в любом случае.
SET @outparam = null;
CALL checkUser(?, ?, @outparam);
SELECT @outparam;
При возврате наборов результатов из хранимой процедуры проще всего использовать запрос SELECT
.