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