Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2016, 12:42   #1
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
Злость рекурсивная функция

Код:
CREATE OR REPLACE FUNCTION accounts.get_group_by_group(
    IN _id uuid,
    OUT _name character varying)
  RETURNS character varying AS
$BODY$
DECLARE
    nm character varying;  
    self_id character varying;
    r uuid;
BEGIN
    self_id:='';
    FOR r IN SELECT id FROM accounts.groups WHERE parent_id = _id LOOP  

      self_id =''''|| r || ''',' || self_id; 
     SELECT accounts.get_group_by_group(r) INTO nm;
      self_id = nm || '' || self_id; 

   END LOOP;
     _name = self_id;   
    RETURN;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION accounts.get_group_by_group(uuid)
  OWNER TO postgres;
как в данном запросе вывести не только детей, но и родителя/ т.е. тот id, который поступил на входе в функцию? HELP!

Последний раз редактировалось kate158; 06.12.2016 в 13:07.
kate158 вне форума Ответить с цитированием
Старый 06.12.2016, 13:10   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А добавить еще параметр, в котором везде исходный id передается. И если этот исходный совпадает с _id, тогда прицепить к результату родителя исходного. Так, досужие рассуждения, может в postgresql, если это он, какие-то особые способы для этого случая есть
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.12.2016, 13:16   #3
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию

Аватар, можете в виде кода показать?
если добавить таким образом параметр:
Код:
CREATE OR REPLACE FUNCTION kosino_accounts.from_parent_to_child_groups_test(
    IN _id uuid,
    OUT _name character varying)
  RETURNS character varying AS
$BODY$
DECLARE
    nm character varying;  
    self_id character varying;
    r uuid;
    inid uuid;
BEGIN
    self_id:='';
    inid:=_id;
    FOR r IN SELECT id FROM kosino_accounts.groups WHERE parent_id = _id LOOP  

      self_id =''''|| r || ''',' || self_id||_id || ''',' || inid; 
     SELECT kosino_accounts.from_parent_to_child_groups_test(r) INTO nm;
      self_id = nm || '' || self_id; 

   END LOOP;
     _name = self_id;   
    RETURN;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION kosino_accounts.from_parent_to_child_groups_test(uuid)
  OWNER TO postgres;
, то получается он выводится столько раз, сколько и детей есть в дереве. как сделать один вывод родителя после перебора всех детей?

Последний раз редактировалось kate158; 06.12.2016 в 13:37.
kate158 вне форума Ответить с цитированием
Старый 06.12.2016, 13:45   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Процедурный синтаксис postgresql не знаю, а идея в дополнительном параметре функции
Код:
CREATE OR REPLACE FUNCTION kosino_accounts.from_parent_to_child_groups_test(
    IN _id uuid,
    IN _id0 uuid,
    OUT _name character varying)
...
     SELECT kosino_accounts.from_parent_to_child_groups_test(r,_id0) INTO nm;
...
и если _id0=_id тогда добавляй родителя _id0
При первичном обращении _id=_id0. И осторожней, что бы в бесконечный цикл не войти, мало ли - цепочка приведет на исходный ид
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 06.12.2016 в 13:53.
Аватар вне форума Ответить с цитированием
Старый 06.12.2016, 14:05   #5
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию

жаль, что по шагам код не проверить. что там и как происходит не понимаю. пока не получается вывести входящий id.
kate158 вне форума Ответить с цитированием
Старый 06.12.2016, 14:14   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А трассировщика нет, что-ли?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсивная функция C++ Андрей Иванов Помощь студентам 2 10.05.2015 15:25
рекурсивная функция С++ Zapt1k Помощь студентам 7 05.06.2013 13:44
Рекурсивная функция Alerq Паскаль, Turbo Pascal, PascalABC.NET 2 17.04.2011 18:42