MySQL курсор всегда выходит из цикла - PullRequest
0 голосов
/ 01 апреля 2020

Запрос курсора и запрос select value возвращают строки, если я запускаю его в mysql, но когда в курсоре он всегда выходит из l oop.

Что-то здесь не так?

Я добавил «ДО L OOP», «EXIT» и «IN L OOP», чтобы он печатал там, где он есть, но всегда начинается с BEFORE LOOP, а затем заканчивается EXIT.

CREATE PROCEDURE getTotal()
BEGIN

DECLARE HOSTID INT;
DECLARE cITEMID INT;
DECLARE Total INT;
declare finished INT default false;
declare cur1 cursor for SELECT itemid  FROM items WHERE hostid = 10579;
declare continue handler for not found set finished = true;

open cur1;
   loop_1: loop
        fetch cur1 into cITEMID;
        SELECT "BEFORE LOOP";
        if finished then
            SELECT "EXIT";
            leave loop_1;
        end if;
        SELECT "IN LOOP";
-- Test query
      SELECT value from history_uint WHERE itemid = cITEMID ORDER BY itemid DESC LIMIT 1;

-- Final select query will look like this.
-- SET @Total := @Total + (SELECT value from history_uint WHERE itemid = cITEMID ORDER BY itemid DESC LIMIT 1);
-- SELECT @Total;

  end loop;
close cur1;

END //

DELIMITER ;

Запросы:

SELECT itemid  FROM items WHERE hostid = 10579;
| itemid |
| 12345  |
| 12346  |
| 12347  |

SELECT value from history_uint WHERE itemid = 12345 ORDER BY itemid DESC LIMIT 1;
| value | 
| 1     |

1 Ответ

0 голосов
/ 02 апреля 2020

Выяснил проблему.

Переменная не должна совпадать с любым столбцом в запросе.

DECLARE HOSTID INT;

declare cur1 cursor for SELECT itemid  FROM items WHERE hostid = 10579;

Поскольку запрос cur1 имеет столбец с именем hostid, он вызовет обработчик продолжения not found, который устанавливает переменную finished в true.

Не только запускает обработчик продолжения, но в некоторых случаях может вызвать синтаксическую ошибку. Источник - { ссылка }

Решение переименуйте переменную HOSTID в _HOSTID.

DECLARE _HOSTID INT;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...