Проблема цикла хранимых процедур MySQL - PullRequest
1 голос
/ 12 августа 2011

Итак, у меня есть курсор с именем open_loop, который выполняет запрос, и теперь я хочу пройтись по нему, проверить, существует ли значение, которое он содержит, в базе данных, если так, то мне нужно обновить эту запись, если не вставить ее.

Проблема в том, что выход из цикла заключается в ожидании состояния 02000: Успешно, но строк не найдено . К сожалению, это также происходит, если в пользовательской таблице нет записи, поэтому цикл обрезается прямо сейчас! Как я могу сделать так, чтобы он не срабатывал для этого события, но все равно срабатывал, если в loop_cur закончились записи, или, возможно, нашел другой способ выхода из цикла?

Мой код здесь:

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
OPEN loop_cur;

REPEAT

    FETCH  loop_cur
    INTO   user_id, user_info

    SELECT Id INTO user_id  FROM users WHERE Id = user_id;

    IF user_id IS NOT NULL THEN

      UPDATE users
      SET info = user_info
      WHERE Id = user_id;

    ELSE
      INSERT INTO users (user_info);
    END IF;
  UNTIL done END REPEAT;
CLOSE loop_cur;

Пожалуйста, обратите внимание, что это не упрощается, поскольку я действительно вставляю и извлекаю гораздо больше значений, а запрос для loop_cur довольно сложный, поэтому я его не включил, но он работает.

Наконец, я не могу использовать INSERT ON DUPLICATE KEY UPDATE, то, что я проверяю, на самом деле не user_id, это другой столбец, я использовал user_id для простоты.

1 Ответ

0 голосов
/ 12 августа 2011

Используйте логическую переменную, для которой в цикле установлено значение true.

Нерелевантный код удален для простоты:

DECLARE found boolean default false;

...

REPEAT

    FETCH  loop_cur ...

    SET found = true;

    ...

UNTIL done END REPEAT;

-- found is now true if you got some rows, false otherwise
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...