Info-System

Alternatywna metoda iterowania po kursorze w mysql

Email Drukuj PDF

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;   

Dodaj komentarz


Kod antysapmowy
Odśwież

Joomlart