Мир InterBase


Рекурсивные хранимые процедуры - часть 3


В хранимых процедурах, обрабатывающих древообразные структуры, сложилась своя терминология. Каждый элемент дерева называются узлом; а отношения между ссылающимися друг на друга узлами называется отношениями родитель-потомок. Узлы, находящиеся на самом конце дерева и не имеющие потомков, называются "листьями".

У кашей хранимой процедуры входным параметром будет идентификатор категории, начиная с которого мы должны будем начать развертку. Хранимая процедура будет иметь следующий вид:


CREATE PROCEDURE GETFULLNAME (ID_GOOD2SHOW INTEGER) 

RETURNS (FULL_GOODS_NAME VARCHAR(1000), 

ID_CHILD_GOOD INTEGER) 

AS

DECLARE VARIABLE CURR_CHILD_NAME VARCHAR(80);

BEGIN

/*0рганизуем внешний цикл FOR SELECT по непосредственным потомкам товара с ID_GOOD=ID_GOOD2SHOW */ 

FOR SELECT gtl.id_good, gtl.good_name 

FROM GoodsTree gtl

WHERE gtl.id_parent_good=:ID_good2show 

INTO:ID_CHILD_GOOD, :full_goods_name 

DO

BEGIN

/"Проверка с помощью функции EXISTS, которая возвращает TRUE, если запрос в скобках вернет хотя бы одну строку. Если у найденного узла с ID_PARENT_GOOD = ID_CHILD_GOOD нет потомков, то он является "листом" дерева и попадает в результаты */ 

IF (NOT EXISTS(

SELECT * FROM GoodsTree

WHERE GoodsTree.id_parent_good=:id_child_good)) 

THEN 

BEGIN 

/* Передаем "лист" дерева в результаты */

SUSPEND; 

END

ELSE 

/* Для узлов, у которых есть потомки*/

BEGIN 

/*сохраняем имя узла-родителя во временной переменной */

CURR_CHILD_NAME=full_goods_name; 

/* рекурсивно запускаем эту процедуру */ 

FOR

SELECT ID_CHILD_GOOD, full_goods_name 

FROM GETFULLNAME (:ID_CHILD_GOOD) 

INTO:ID_CHILD_GOOD, :full_goods_name 

DO BEGIN

/*добавляем лмя узла-родителя к найденном., имени потомка с помощью операции конкатенации строк || */

full_goods_name=CURR_CHILD_NAME| ' ' | f ull_goods_name,-

SUSPEND; /* возвращаем полное имя товара*/ 

END 




Начало  Назад  Вперед



Книжный магазин