Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 06.12.2016, 13:42   #1
kate158
Форумчанин
 
Регистрация: 01.08.2008
Адрес: Saint-Petersburg
Сообщений: 382
Репутация: 94

icq: 455028129
skype: miledy158
Злость рекурсивная функция

Код:

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 в 14:07.
kate158 вне форума   Ответить с цитированием
Старый 06.12.2016, 14:10   #2
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 16,805
Репутация: 5909
По умолчанию

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

icq: 455028129
skype: miledy158
По умолчанию

Аватар, можете в виде кода показать?
если добавить таким образом параметр:
Код:

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 в 14:37.
kate158 вне форума   Ответить с цитированием
Старый 06.12.2016, 14:45   #4
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 16,805
Репутация: 5909
По умолчанию

Процедурный синтаксис 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 в 14:53.
Аватар на форуме   Ответить с цитированием
Старый 06.12.2016, 15:05   #5
kate158
Форумчанин
 
Регистрация: 01.08.2008
Адрес: Saint-Petersburg
Сообщений: 382
Репутация: 94

icq: 455028129
skype: miledy158
По умолчанию

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

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



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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




00:48.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru