使用SELECT结果集使用MySQL存储过程运行UPDATE查询

tir*_*hen 4 mysql sql stored-procedures resultset

我正在尝试了解MySQL存储过程,我想检查用户登录凭据是否有效,如果是,请更新用户在线状态:

-- DROP PROCEDURE IF EXISTS checkUser;
DELIMITER //
CREATE PROCEDURE checkUser(IN in_email VARCHAR(80), IN in_password VARCHAR(50))
BEGIN
    SELECT id, name FROM users WHERE email = in_email AND password = in_password LIMIT 1;
    -- If result is 1, UPDATE users SET online = 1 WHERE id = "result_id";
END //
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

如何根据结果集行数== 1或id IS NOT NULL创建此if语句?

Bil*_*win 7

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 ;
Run Code Online (Sandbox Code Playgroud)

注意:我没有测试过这个.MySQL可能不喜欢UPDATE对象当前有一个游标打开的表.

PS:您应该重新考虑如何存储密码.


关于RETURNvs. OUT与结果集的评论:

RETURN仅用于存储的函数,而不是存储过程.如果要在另一个SQL表达式中调用例程,则使用存储函数.

SELECT LCASE( checkUserFunc(?, ?) );
Run Code Online (Sandbox Code Playgroud)

您可以使用OUT参数,但必须首先声明用户变量作为该参数传递.然后你必须选择该用户变量来获得它的价值.

SET @outparam = null;
CALL checkUser(?, ?, @outparam);
SELECT @outparam;
Run Code Online (Sandbox Code Playgroud)

从存储过程返回结果集时,最简单的方法是使用SELECT查询.