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:Ich habe dies nicht getestet. Es ist möglich, dass MySQL UPDATE nicht für eine Tabelle mag, für die gerade ein Cursor geöffnet ist.
PS:Sie sollten überdenken, wie Sie Passwörter speichern .
Re-Kommentar zu RETURN
vs. OUT
vs. Ergebnismenge:
RETURN
wird nur in gespeicherten Funktionen verwendet, nicht in gespeicherten Prozeduren. Gespeicherte Funktionen werden verwendet, wenn Sie die Routine innerhalb eines anderen SQL-Ausdrucks aufrufen möchten.
SELECT LCASE( checkUserFunc(?, ?) );
Sie können einen OUT
verwenden Parameter, aber Sie müssen zuerst eine Benutzervariable deklarieren, die als dieser Parameter übergeben wird. Und dann müssen Sie diese Benutzervariable trotzdem auswählen, um ihren Wert zu erhalten.
SET @outparam = null;
CALL checkUser(?, ?, @outparam);
SELECT @outparam;
Beim Zurückgeben von Ergebnismengen aus einer gespeicherten Prozedur ist es am einfachsten, ein SELECT
zu verwenden Anfrage.