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:Jeg har ikke testet dette. Det er muligt, at MySQL ikke kan lide UPDATE mod en tabel, som den i øjeblikket har en markør åben for.
PS:Du bør genoverveje hvordan du gemmer adgangskoder .
Rekommentar om RETURN
vs. OUT
vs. resultatsæt:
RETURN
bruges kun i lagrede funktioner, ikke lagrede procedurer. Lagrede funktioner bruges, når du vil kalde rutinen i et andet SQL-udtryk.
SELECT LCASE( checkUserFunc(?, ?) );
Du kan bruge en OUT
parameter, men du skal først erklære en brugervariabel for at passere som denne parameter. Og så skal du vælge den brugervariabel for at få dens værdi alligevel.
SET @outparam = null;
CALL checkUser(?, ?, @outparam);
SELECT @outparam;
Når du returnerer resultatsæt fra en lagret procedure, er det nemmest at bruge en SELECT
forespørgsel.