Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verwenden der SELECT-Ergebnismenge zum Ausführen der UPDATE-Abfrage mit gespeicherten MySQL-Prozeduren

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.