Проблема с вложенными курсорами MySQL - PullRequest
0 голосов
/ 08 июля 2010

У меня есть следующий набор кода, пытающийся обновить поле, используя 2 курсора, один внутри другого. Я использую первый курсор только для получения значения идентификатора (1-й курсор), а затем получаю список других значений идентификатора на основе этого идентификатора (2-й курсор). Проблема в том, что результирующий набор из 2-го курсора дважды содержит последний идентификатор! Я не могу найти ошибку! Что-то в цикле, что-то в переменной завершения для 2 курсоров?

Любая помощь более чем приветствуется! Заранее спасибо!

РАЗДЕЛИТЕЛЬ $$ ПРОЦЕДУРА ОТМЕНЫ, ЕСЛИ СУЩЕСТВУЕТ updateNumberOfPoisForPlacesWithChildren $$ СОЗДАНИЕ ПРОЦЕДУРЫ updateNumberOfPoisForPlacesWithChildren () НАЧАТЬ ОБЪЯВИТЬ single_place_id INT (11); ОБЪЯВИТЬ single_unique_parents_id INT (11); ОБЪЯВИТЬ готово, temp_number_of_pois, sum_number_of_pois INT DEFAULT 0;

    DECLARE unique_parents_ids CURSOR FOR SELECT DISTINCT `parent_id` FROM `places` WHERE `parent_id` IS NOT NULL;
    DECLARE temp_places_ids CURSOR FOR SELECT `id` FROM `places` WHERE `parent_id` = single_unique_parents_id;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    OPEN unique_parents_ids;

    main_loop_for_parent_ids : LOOP
        SET sum_number_of_pois = 0;
        IF done = 1 THEN
            CLOSE unique_parents_ids;
            LEAVE main_loop_for_parent_ids;
        END IF;

        IF NOT done = 1 THEN
            FETCH unique_parents_ids INTO single_unique_parents_id;
            OPEN temp_places_ids;
            main_loop_for_places : LOOP
                IF done = 1 THEN
                    CLOSE temp_places_ids;
                    LEAVE main_loop_for_places;
                END IF;

                IF NOT done = 1 THEN
                    FETCH temp_places_ids INTO single_place_id;
                    SELECT COUNT(`id`) INTO temp_number_of_pois FROM `pois` WHERE `place_id` = single_place_id;
                    SET sum_number_of_pois = sum_number_of_pois + temp_number_of_pois;
                END IF;

            END LOOP;   

            UPDATE `places` SET `number_of_pois`=sum_number_of_pois WHERE `id` = single_unique_parents_id;

        END IF;
    END LOOP;



END$$

РАЗДЕЛИТЕЛЬ;

1 Ответ

0 голосов
/ 08 июля 2010

Я думаю, что ваша проблема здесь ...

        IF NOT done = 1 THEN
            FETCH temp_places_ids INTO single_place_id;
            SELECT COUNT(`id`) INTO temp_number_of_pois FROM `pois` WHERE `place_id` = single_place_id;
            SET sum_number_of_pois = sum_number_of_pois + temp_number_of_pois;
        END IF;

FETCH устанавливает DONE на 1, когда исчерпывает набор результатов, но вы продолжаете, потому что вы уже прошли тест DONE.1004 *

Возможно ...

 FETCH temp_places_ids INTO single_place_id;
 IF NOT done = 1 THEN
     SELECT COUNT(`id`) INTO temp_number_of_pois FROM `pois` WHERE `place_id` = single_place_id;
     SET sum_number_of_pois = sum_number_of_pois + temp_number_of_pois;
 END IF;
...