sql >> Base de Datos >  >> RDS >> Mysql

Usando el conjunto de resultados SELECT para ejecutar la consulta ACTUALIZAR con los procedimientos almacenados de MySQL

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:No he probado esto. Es posible que a MySQL no le guste ACTUALIZAR contra una tabla para la que actualmente tiene un cursor abierto.

PD:deberías reconsiderar cómo almacenas las contraseñas .

Volver a comentar sobre RETURN contra OUT frente al conjunto de resultados:

RETURN se usa solo en funciones almacenadas, no en procedimientos almacenados. Las funciones almacenadas se utilizan cuando desea llamar a la rutina dentro de otra expresión SQL.

SELECT LCASE( checkUserFunc(?, ?) );

Puedes usar un OUT parámetro, pero primero debe declarar una variable de usuario para pasar como ese parámetro. Y luego tienes que seleccionar esa variable de usuario para obtener su valor de todos modos.

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

Al devolver conjuntos de resultados de un procedimiento almacenado, es más fácil usar un SELECT consulta.