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 ;
Uwaga:nie testowałem tego. Możliwe, że MySQL nie lubi UPDATE względem tabeli, do której aktualnie ma otwarty kursor.
PS:Powinieneś ponownie rozważyć, jak przechowujesz hasła .
Ponownie komentarz na temat RETURN
vs. OUT
a zestaw wyników:
RETURN
jest używany tylko w funkcjach składowanych, a nie w procedurach składowanych. Przechowywane funkcje są używane, gdy chcesz wywołać procedurę w innym wyrażeniu SQL.
SELECT LCASE( checkUserFunc(?, ?) );
Możesz użyć OUT
parametr, ale najpierw musisz zadeklarować zmienną użytkownika, która zostanie przekazana jako ten parametr. A potem musisz wybrać tę zmienną użytkownika, aby mimo wszystko uzyskać jej wartość.
SET @outparam = null;
CALL checkUser(?, ?, @outparam);
SELECT @outparam;
Podczas zwracania zestawów wyników z procedury składowanej najłatwiej jest użyć SELECT
zapytanie.