MariaDB 10.6.4. Курсор в цикле возвращает одно и то же значение

Рейтинг: 0Ответов: 0Опубликовано: 14.03.2023

Сравниваю курсором 2 столбца таблицы по 1000 строк за раз. Для этого в цикл засунул её представление через каждые 1000 строк и вызов курсора. Если столбцы отличаются, то выводится номер строки.

Одна и та же процедура срабатывает по-разному в 2-х приложениях: в воркбенче (или сразу в терминале linux) и в debugger for mysql.

Подскажите, пожалуйста, что происходит с курсором после CLOSE? В первой итерации он отработал, и я его закрываю, далее начинается следующая итерация, где я снова открываю курсор (можно выделить его в отдельную функцию) - он сработает и FETCH запишет новое значение в переменную? Потому как на i+1 шагах снова и снова выводится результат из первой итерации. Стоит прогнать в debugger for mysql - всё ок. Возможно, у него какой-то свой алгоритм работы...

CREATE PROCEDURE pCheck(IN _tableName VARCHAR(45),
                           _tableName2 VARCHAR(45),
                           _nRange INT)
BEGIN
    
DECLARE _IDrow1 BIGINT(20);
DECLARE i INT DEFAULT 0;
DECLARE Cursor_Done INT DEFAULT FALSE;
DECLARE Hash_Cursor CURSOR FOR
(
 SELECT if(Col1 <> Col2, ID, 0) as _ID
 FROM table_prepare_vw having (_ID <> 0)
);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET Cursor_Done = TRUE;

WHILE i <= _nRange DO

    SET @tableView = CONCAT('CREATE VIEW table_prepare_vw AS SELECT A.ID, A.Col1, B.Col2 FROM ',
                            _tableName,
                            ' AS A JOIN ',
                            _tableName2,
                            ' AS B ON A.ID = B.ID limit ', i*1000, ', 1000')

    PREPARE stm FROM @tableView;
    EXECUTE stm;
    DEALLOCATE PREPARE stm;

    OPEN Hash_Cursor;

    read_loop: LOOP
        FETCH
            Hash_Cursor
        INTO
            _IDrow1;

    IF Cursor_Done THEN
        LEAVE read_loop;
    END IF;

    CLOSE Hash_Cursor;
    END LOOP;

    ID _IDrow1 <> 0 THEN
        select что-нибудь;

    DROP VIEW table_prepare_vw;
    SET i = i + 1;

END WHILE;

END

Ответы

Ответов пока нет.