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:Jag har inte testat detta. Det är möjligt att MySQL inte gillar UPDATE mot en tabell som den för närvarande har en markör öppen för.
PS:Du bör ompröva hur du lagrar lösenord .
Återkommentar om RETURN
kontra OUT
kontra resultatuppsättning:
RETURN
används endast i lagrade funktioner, inte lagrade procedurer. Lagrade funktioner används när du vill anropa rutinen inom ett annat SQL-uttryck.
SELECT LCASE( checkUserFunc(?, ?) );
Du kan använda en OUT
parameter, men du måste först deklarera en användarvariabel för att skickas som den parametern. Och sedan måste du välja den användarvariabeln för att få dess värde ändå.
SET @outparam = null;
CALL checkUser(?, ?, @outparam);
SELECT @outparam;
När du returnerar resultatuppsättningar från en lagrad procedur är det enklast att använda en SELECT
fråga.