Mysql
 sql >> Database >  >> RDS >> Mysql

Utilizzo di SELECT set di risultati per eseguire query UPDATE con MySQL Stored Procedure

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:non l'ho testato. È possibile che a MySQL non piaccia UPDATE rispetto a una tabella per la quale ha attualmente un cursore aperto.

PS:dovresti riconsiderare come stai memorizzando le password .

Commento su RETURN rispetto a OUT rispetto al set di risultati:

RETURN viene utilizzato solo nelle funzioni memorizzate, non nelle procedure memorizzate. Le funzioni memorizzate vengono utilizzate quando si desidera chiamare la routine all'interno di un'altra espressione SQL.

SELECT LCASE( checkUserFunc(?, ?) );

Puoi usare un OUT parametro, ma devi prima dichiarare una variabile utente per passare come parametro. E poi devi selezionare quella variabile utente per ottenere comunque il suo valore.

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

Quando si restituiscono set di risultati da una procedura memorizzata, è più semplice utilizzare un SELECT interrogazione.