sql >> Databasteknik >  >> RDS >> Mysql

Använder SELECT resultatuppsättning för att köra UPDATE-fråga med MySQL Stored Procedures

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 ;

OBS:Jag har inte testat detta. Det är möjligt att MySQL inte gillar UPDATE mot en tabell som den för närvarande har en markör öppen för.

PS:Du bör ompröva hur du lagrar lösenord .

Återkommentar om RETURN kontra OUT kontra resultatuppsättning:

RETURN används endast i lagrade funktioner, inte lagrade procedurer. Lagrade funktioner används när du vill anropa rutinen inom ett annat SQL-uttryck.

SELECT LCASE( checkUserFunc(?, ?) );

Du kan använda en OUT parameter, men du måste först deklarera en användarvariabel för att skickas som den parametern. Och sedan måste du välja den användarvariabeln för att få dess värde ändå.

SET @outparam = null;
CALL checkUser(?, ?, @outparam);
SELECT @outparam;

När du returnerar resultatuppsättningar från en lagrad procedur är det enklast att använda en SELECT fråga.



  1. Flask, inte alla argument konverterade under strängformatering

  2. Vad är det snabbaste sättet att trunkera tidsstämplar till 5 minuter i Postgres?

  3. Migrera MySQL-databas från Amazon RDS till DigitalOcean

  4. Skillnader i veckor mellan PHP och MySQL