Problem polega na tym, że ponowne otwarcie tego samego CURSOR-a w procedurze,
kończy się brakiem danych, jak i również kolejne otwarcia.
Tylko pierwsze otwarcie CURSOR-a, zwraca dane.
Nie wiem czy to błąd czy też cecha MySQL-aPoniżej przedstawiam działający przykład, powtórnego otwarcia CURSOR-a, który sprawia problem.
Procedura 2 razy otwiera CURSOR
cur_sel.
Za drugim, otwarcie i pobranie danych kończy się natychmiast brakiem danych .
Wywołanie:
call test_cursor(@txt); select @txtWynik:
1) il=91 2) il=0Interpretacja:
1-e otwarcie kursora zwróciło 91 rekordów, ale 2-e już zero(!).
Kod
-- call test_cursor(@txt); select @txt
-- DROP PROCEDURE IF EXISTS test_cursor;
CREATE PROCEDURE test_cursor( out p_txt char(70) )
proc_block: BEGIN
DECLARE is_end_cursor int DEFAULT 0;
DECLARE v_id BIGINT DEFAULT 0;
DECLARE il INT DEFAULT 0;
DECLARE txt CHAR(80) DEFAULT "";
DECLARE cur_sel CURSOR FOR
SELECT id FROM pk_jakas_tabela
;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET is_end_cursor = TRUE;
-- start 1 petla ----------------------
OPEN cur_sel;
loop_sel: LOOP
FETCH cur_sel INTO v_id;
IF( is_end_cursor ) THEN LEAVE loop_sel; END IF;
SET il=il+1;
END LOOP loop_sel;
CLOSE cur_sel;
-- end 1 petla ----------------------
-- Budowa tekstu
SET txt=concat("1) il=", convert(il, char(10)) );
SET p_txt=concat(IFNULL(p_txt,""), txt);
-- start 2 petla ----------------------
SET il=0;
OPEN cur_sel;
loop_sel2: LOOP
FETCH cur_sel INTO v_id;
IF( is_end_cursor ) THEN LEAVE loop_sel2; END IF;
SET il=il+1;
END LOOP loop_sel2;
CLOSE cur_sel;
-- end2 petla ----------------------
-- Budowa tekstu: 2) il= ....
SET txt=concat(" 2) il=", convert(il, char(10)) );
SET p_txt=concat(IFNULL(p_txt,""), txt);
END proc_block;