Witam,
z racji tego iż muszę rozwiązać problem przetworzenia danych w tabeli, o którym pisałem tutaj na forum ( http://4programmers.net/Forum/Bazy_danych/222107-przetworzenie_wynikow_z_tabel_-_moze_ktos_pomoze ) zacząłem kombinować z kursorem i krótko mówiąc mam z nim problem, ponieważ zwraca on niezrozumiały dla mnie wynik.
Podam ostatni przykład, który zrobiłem w ramach testów;
DELIMITER $$
CREATE PROCEDURE myProc()
BEGIN
DECLARE t_result_id INT(10);
DECLARE t_participant_id INT(10);
DECLARE t_ct_id INT(10);
DECLARE t_total_value INT(5);
DECLARE done INT DEFAULT 0;
DECLARE cur1 CURSOR FOR SELECT result_id,participant_id,total_value FROM result_ct_2 ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
CREATE TEMPORARY TABLE IF NOT EXISTS temp_table
(result_id INT(10), participant_id INT(10), ct_id INT(10), total_value INT(5));
OPEN cur1;
REPEAT
FETCH cur1 INTO t_result_id, t_participant_id,t_total_value;
INSERT INTO temp_table (result_id,participant_id,total_value)
VALUES (t_result_id,t_participant_id,t_total_value);
UNTIL done END REPEAT;
CLOSE cur1;
/* Print out the changed salaries*/
SELECT result_id,participant_id,ct_id,total_value from temp_table
ORDER BY result_id;
END $$
DELIMITER ;
call myProc();
Wynik kształtuje się następująco:
Prawa tabela to poprawny wynik uzyskany ze zwykłego select'a dla zwykłej tabeli.
Lewa tabela to **niepoprawny **wynik uzyskany z select'a z procedury z tabeli tymczasowej. Jak widać, z niewiadomych mi przyczyn ostatni wpis został powielony. Co ciekawe, wcześniej wykonywałem tą samą procedury tylko bez ostatniej kolumny (total_value) w FETCH i innych miejscach, i uzyskany wynik był różny od tego ostatniego... wtedy powielony został wpis o result_id = 8 .. 0.o
Może mi ktoś wytłumaczyć co tu się dzieje ? ;]
(z góry dzięki za zainteresowanie!)
Pozdrawiam,
Michał
EDIT:
Znalazłem rozwiązanie powyższego problemu - podobno mysql czasami nie potrafi dobrze w współdziałać z poleceniem:
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
i należy w zastępstwie zastosować do iteracji:
SELECT FOUND_ROWS() INTO numRows;
Trochę dziwna sprawa .. ale z drugiej strony przy mysql to pewnie nic nadzwyczajnego :P