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 ;
Pozn.:Toto jsem netestoval. Je možné, že MySQL nemá rád UPDATE proti tabulce, pro kterou má aktuálně otevřený kurzor.
PS:Měli byste si rozmyslet jak ukládáte hesla .
Znovu okomentujte RETURN
vs. OUT
vs. sada výsledků:
RETURN
se používá pouze v uložených funkcích, nikoli v uložených procedurách. Uložené funkce se používají, když chcete volat rutinu v rámci jiného výrazu SQL.
SELECT LCASE( checkUserFunc(?, ?) );
Můžete použít OUT
parametr, ale musíte nejprve deklarovat uživatelskou proměnnou, která bude předána jako tento parametr. A pak musíte vybrat tuto uživatelskou proměnnou, abyste přesto získali její hodnotu.
SET @outparam = null;
CALL checkUser(?, ?, @outparam);
SELECT @outparam;
Při vracení sad výsledků z uložené procedury je nejjednodušší použít SELECT
dotaz.