Firebird, хранимые процедуры и хлебные крошки
Добавлено: 09.12.2017 20:27:55
Доброго дня!
Имеем таблицу вида:
В ней хранится некое классическое дерево.
Стоит задача получить "Хлебные Крошки" (Навигационную цепочку) от указанного узла до корня.
Чтение документации привело меня к написанию такой хранимой процедуры:
Так как процедура селективная, то вызываю строкой:
К моменту достижения корня дерева переменная varbreadcrumps содержит полный путь от указанного узла до корня.
Теперь стоит задача "свернуть" результат работы процедуры и вывести его(результат) одной строкой, содержащую только переменную varbreadcrumps.
В этом у меня проблема... Прошу помощи...
Добавлено спустя 8 минут 29 секунд:
Разобрался.
Надо перенести
И процедура примет вид:
Имеем таблицу вида:
- Код: Выделить всё
ID IDPARENT NAME
В ней хранится некое классическое дерево.
Стоит задача получить "Хлебные Крошки" (Навигационную цепочку) от указанного узла до корня.
Чтение документации привело меня к написанию такой хранимой процедуры:
- Код: Выделить всё
create or alter procedure GETPARENTS_GROUP_CATALOG (
ID integer)
returns (
CID integer,
PARENTID integer,
NAME varchar(30))
as
declare variable VARBREADCRUMPS varchar(6000);
BEGIN
varbreadcrumps = '';
WHILE (:ID > 0) DO /* ищем до корня */
BEGIN
SELECT G.ID, G.IDPARENT, G.NAME
FROM "GROUP-CATALOG" G
WHERE G.ID = :ID
INTO :CID, :PARENTID, :NAME;
varbreadcrumps = NAME||' '||varbreadcrumps;
ID = :PARENTID; /* код родителя для следующей выборки */
SUSPEND;
END
END
Так как процедура селективная, то вызываю строкой:
- Код: Выделить всё
select * from GETPARENTS_GROUP_CATALOG(10);
К моменту достижения корня дерева переменная varbreadcrumps содержит полный путь от указанного узла до корня.
Теперь стоит задача "свернуть" результат работы процедуры и вывести его(результат) одной строкой, содержащую только переменную varbreadcrumps.
- Код: Выделить всё
select * from GETPARENTS_GROUP_CATALOG(IDNode3); =>> [Root Node1 Node2 Node3]
В этом у меня проблема... Прошу помощи...
Добавлено спустя 8 минут 29 секунд:
Разобрался.
Надо перенести
- Код: Выделить всё
SUSPEND;
И процедура примет вид:
- Код: Выделить всё
create or alter procedure GETPARENTS_GROUP_CATALOG (
ID integer)
returns (
BREADCRUMPS varchar(6000),
CID integer,
PARENTID integer,
NAME varchar(30))
as
declare variable VARBREADCRUMPS varchar(6000);
BEGIN
varbreadcrumps = '';
WHILE (:ID > 0) DO /* ищем до корня */
BEGIN
SELECT G.ID, G.IDPARENT, G.NAME
FROM "GROUP-CATALOG" G
WHERE G.ID = :ID
INTO :CID, :PARENTID, :NAME;
varbreadcrumps = NAME||' \ '||varbreadcrumps;
breadcrumps = varbreadcrumps;
ID = :PARENTID; /* код родителя для следующей выборки */
--SUSPEND;
END
SUSPEND;
END