Dziś natknąłem się na mało przyjemnego buga w mysql'u i to w czymś tak powszechnie używanym jak kursor. Zazwyczaj w mysql iteracja po kursorze oparta jest o zdefiniowanie tzw. handlera kontynuacji. Jak się niestety okazuje ta metoda, której używałem od dawna, nie działa we wszystkich przypadkach! W moim przypadku efekt był taki, że kursor robił tylko 2 pętle zamiast 40.
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
Przykład użycia tej metoda opisany jest tutaj. Sposobem na ominięcie handlera jest policzenie wierszy, które zostały przypisane do kursora przy użyciu funkcji "found_rows()". UWAGA! Ważne jest to, żeby wywołać tę funkcję zaraz po otworzeniu kursora.
A tak to wygląda w praktyce
drop procedure IF exists calc_props;
delimiter $$
CREATE PROCEDURE calc_props()
BEGIN
DECLARE actual_row_number INTEGER DEFAULT 0;
DECLARE numRows INTEGER DEFAULT 0;
declare calc_id BIGINT;
declare form_to_change_id BIGINT;
declare our_cursor CURSOR FOR
select id, form_id from calculator;
OPEN our_cursor;
SELECT FOUND_ROWS() INTO numRows;
select numRows;
get_form: LOOP
FETCH our_cursor INTO calc_id,form_to_change_id;
-- logika kursora
set actual_row_number := actual_row_number+1;
IF actual_row_number>=numRows THEN
LEAVE get_form;
END IF;
END LOOP get_form;
CLOSE our_cursor;
END $$
delimiter ;
delete from calc_property;
call calc_props();
drop procedure IF exists calc_props;




