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:ik heb dit niet getest. Het is mogelijk dat MySQL UPDATE niet leuk vindt tegen een tabel waarvoor momenteel een cursor is geopend.
PS:heroverweeg hoe je wachtwoorden opslaat .
Re commentaar over RETURN
vs. OUT
vs. resultatenset:
RETURN
wordt alleen gebruikt in opgeslagen functies, niet in opgeslagen procedures. Opgeslagen functies worden gebruikt wanneer u de routine binnen een andere SQL-expressie wilt aanroepen.
SELECT LCASE( checkUserFunc(?, ?) );
U kunt een OUT
. gebruiken parameter, maar u moet eerst een gebruikersvariabele declareren om als parameter door te geven. En dan moet je die gebruikersvariabele selecteren om de waarde toch te krijgen.
SET @outparam = null;
CALL checkUser(?, ?, @outparam);
SELECT @outparam;
Bij het retourneren van resultatensets van een opgeslagen procedure, is het het gemakkelijkst om een SELECT
. te gebruiken vraag.