SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 11.04.2013 23:24:30

DeepVarvar
Участник
Зарегистрирован: 11.04.2013
Сообщений: 1

Оптимиз. MySQL-процедуры

Так..
Чесслово, пишу процедуру, и вообще процедуру на мускуле впервые в жизни.
Ну вот не доводилось.
Написал - оказалось ничего сложного.
Однако.. есть несколько вопросов.
Сперва сам код:


CREATE PROCEDURE check_parent_candidate(IN main_id BIGINT(20), IN candidate_parent_id BIGINT(20), OUT status TINYINT(1))

    READS SQL DATA

    BEGIN

        DECLARE i BIGINT(20);
        DECLARE c BIGINT(20);
        DECLARE candidate BIGINT(20);

        DECLARE children CURSOR FOR SELECT id FROM documents WHERE parent_id = main_id;

        SET status = 0;
        SELECT COUNT(1) INTO c FROM documents WHERE parent_id = main_id;

        IF c > 0 THEN

            SET i = 0;
            OPEN children;
            search : WHILE i < c DO

                FETCH children INTO candidate;

                IF candidate = candidate_parent_id THEN
                    SET status = 1;
                    LEAVE search;
                END IF;

                SET i = i + 1;

            END WHILE search;
            CLOSE children;

            IF status = 0 THEN

                SET i = 0;
                OPEN children;
                subsearch : WHILE i < c DO

                FETCH children INTO candidate;

                    CALL check_parent_candidate(candidate, candidate_parent_id, status);
                    IF status = 1 THEN
                        LEAVE subsearch;
                    END IF;

                    SET i = i + 1;

                END WHILE subsearch;
                CLOSE children;

            END IF;

        END IF;

    END$$


DELIMITER ;



Этот кусок кода получает id редактируемого элемента и parent_id - желаемый id родителя.

Структура таблицы проста как дважда-два:

id | parent_id | name

Я проверяю, что "кандидат" на родителя не является в данный момент потомком целевого объекта,
а так же потомки потомков [потомков...[потомков...[потомков...]]] целевого объекта не являются "кандидатом" на родителя.

Теперь вопросы:

1) OUT status в аргументах процедуры - это что-то типа global $status в функции в php?
2) Когда я только объявляю курсор, запрос уже выполняется или это происходит только при OPEN курсора?
3) Второй OPEN идет за данными еще раз?
4) В первом цикле идет обход ближайших непосредственных потомков, без ухода в рекурсию, если найдено, я не пойду в рекурсию, а верну успех. Второй цикл идет уже именно по рекурсивным потомкам. Так вот, я пробовал по разному, я не знаю как, возможно есть способ ресетнуть курсор в начало и не ходить еще раз. именно по незнанию я открываю курсор еще раз. как сикануть в начало выборки чтобы не делать еще один OPEN?
5) Является ли status зарезервированным словом в MySQL?
6) По сути выборку я делаю только внутри процедуры, ничего не возвращая наружу. Нужна ли тут эта READS SQL DATA?

Отредактированно DeepVarvar (11.04.2013 23:30:07)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson