Использование набора результатов SELECT для запуска запроса UPDATE с хранимыми процедурами MySQL - PullRequest
4 голосов
/ 14 декабря 2009

Я пытаюсь понять хранимые процедуры 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 ;

Как я могу сделать этот оператор if на основе количества строк в наборе результатов == 1 или id NOT NULL?

Ответы [ 3 ]

7 голосов
/ 14 декабря 2009
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. Я не проверял это. Возможно, MySQL не нравится UPDATE для таблицы, для которой в данный момент открыт курсор.

PS: Вам следует пересмотреть как вы храните пароли .


Re комментарий о RETURN против OUT против набора результатов:

RETURN используется только в хранимых функциях, а не в хранимых процедурах. Хранимые функции используются, когда вы хотите вызвать подпрограмму в другом выражении SQL.

SELECT LCASE( checkUserFunc(?, ?) );

Вы можете использовать параметр OUT, но вы должны сначала объявить пользовательскую переменную, чтобы передать в качестве этого параметра. И затем вы должны выбрать эту переменную пользователя, чтобы получить ее значение в любом случае.

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

При возврате наборов результатов из хранимой процедуры проще всего использовать запрос SELECT.

2 голосов
/ 14 декабря 2009

Использование:

UPDATE USERS
   SET online = 1
 WHERE EXISTS(SELECT NULL
                FROM USERS t
               WHERE t.email = IN_EMAIL
                 AND t.password = IN_PASSWORD
                 AND t.id = id)
   AND id = 'result_id'

Почему у вас есть LIMIT 1 на вашем SELECT? Вы действительно ожидаете, что электронная почта и пароль будут в БД более одного раза?

0 голосов
/ 14 декабря 2009

Вы можете попробовать оператор if, если у вас есть результат, который возвращает 1 Я посмотрел на ваш код, кажется, ничего не возвращает истину, поэтому вы должны рефакторинг его, как было сказано выше, omg пишет, что это правда, почему у вас есть предел 1 в вашем запросе на выборку, где может существовать только один адрес электронной почты? как то так

update users set if(result==1,online=1,online=0) where email=emailadress
...