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 ;
注意:我没有测试过这个。MySQL 可能不喜欢对它当前打开游标的表进行 UPDATE。
PS:您应该重新考虑如何存储密码。
重新评论RETURN
vs. OUT
vs. 结果集:
RETURN
仅用于存储函数,不用于存储过程。当您想在另一个 SQL 表达式中调用例程时,使用存储函数。
SELECT LCASE( checkUserFunc(?, ?) );
您可以使用OUT
参数,但您必须先声明一个用户变量才能作为该参数传递。然后你必须选择那个用户变量来获取它的值。
SET @outparam = null;
CALL checkUser(?, ?, @outparam);
SELECT @outparam;
从存储过程返回结果集时,最容易使用SELECT
查询。