powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / ФИАС - функция или представление данных.
10 сообщений из 10, страница 1 из 1
ФИАС - функция или представление данных.
    #39090177
YurikGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ни у кого нет готового велосипеда (или ссылки на него) в виде функции или процедуры, которая возвращает набор данных (домов) с полями:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
регион,
район, 
город, 
внутригородская территория, 
населенный пункт, 
улица, 
дополнительная территория (ГСК, СНТ, лагери отдыха и т.п.) 
улица на дополнительной территории (улицы, линии, проезды) 
номер дома
houseguid



Наверняка подобный велосипед уже запилен очень оптимально )
...
Рейтинг: 0 / 0
ФИАС - функция или представление данных.
    #39091130
YurikGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YurikGL,

Ну раз ни у кого велосипеда нет, то пока получилось вот так...
Есть определенные сомнения в изоляции имени временной таблицы. Как сделать так, что бы она гарантировано была изолирована в рамках одного факта исполнения функции?


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
CREATE OR REPLACE FUNCTION get_full_address(
    _houseguid text)
  RETURNS table (
formalname_1 text, offname_1 text, shortname_1 text,
formalname_2 text, offname_2 text, shortname_2 text,
formalname_3 text, offname_3 text, shortname_3 text,
formalname_4 text, offname_4 text, shortname_4 text,
formalname_5 text, offname_5 text, shortname_5 text,
formalname_6 text, offname_6 text, shortname_6 text,
formalname_7 text, offname_7 text, shortname_7 text,
formalname_90 text, offname_90 text, shortname_90 text,
formalname_91 text, offname_91 text, shortname_91 text,
postalcode text, 
housenum text, 
buidnum text, 
strucnum text,
strstatus integer) AS
$BODY$

DECLARE _aoguid text;
DECLARE _formalname_1 text; DECLARE _offname_1 text; DECLARE _shortname_1 text;
DECLARE _formalname_2 text; DECLARE _offname_2 text; DECLARE _shortname_2 text;
DECLARE _formalname_3 text; DECLARE _offname_3 text; DECLARE _shortname_3 text;
DECLARE _formalname_4 text; DECLARE _offname_4 text; DECLARE _shortname_4 text;
DECLARE _formalname_5 text; DECLARE _offname_5 text; DECLARE _shortname_5 text;
DECLARE _formalname_6 text; DECLARE _offname_6 text; DECLARE _shortname_6 text;
DECLARE _formalname_7 text; DECLARE _offname_7 text; DECLARE _shortname_7 text;
DECLARE _formalname_90 text; DECLARE _offname_90 text; DECLARE _shortname_90 text;
DECLARE _formalname_91 text; DECLARE _offname_91 text; DECLARE _shortname_91 text;
DECLARE _postalcode text; 
DECLARE _housenum text; 
DECLARE _buidnum text; 
DECLARE _strucnum text;
DECLARE _strstatus integer;



BEGIN
-- процедура возвращает адрес в виде таблицы

-- ищем aoguid адресного элемента, к которому относится дом, а также прочие параметры дома для отображения.
select house02.aoguid, house02.postalcode,house02.housenum,house02.buildnum,house02.strucnum,house02.strstatus
from house02 
where house02.houseguid=_houseguid 
into _aoguid, _postalcode,_housenum,_buidnum,_strucnum,_strstatus;


-- ищем все вышестоящие адресные элементы через рекурсивный запрос


CREATE LOCAL TEMP TABLE temp1 AS
WITH RECURSIVE child_to_parents AS (
  SELECT addrobj.* FROM addrobj
      WHERE aoguid = _aoguid
  UNION ALL
  SELECT addrobj.* FROM addrobj, child_to_parents
      WHERE addrobj.aoguid = child_to_parents.parentguid
        AND addrobj.currstatus = 0
)
SELECT formalname,offname,shortname,aolevel FROM child_to_parents;

-- наполнение информации с дерева адресных элементов
select formalname,offname,shortname from temp1 into _formalname_1,_offname_1,_shortname_1 where aolevel=1;
select formalname,offname,shortname from temp1 into _formalname_2,_offname_2,_shortname_2 where aolevel=2;
select formalname,offname,shortname from temp1 into _formalname_3,_offname_3,_shortname_3 where aolevel=3;
select formalname,offname,shortname from temp1 into _formalname_4,_offname_4,_shortname_4 where aolevel=4;
select formalname,offname,shortname from temp1 into _formalname_5,_offname_5,_shortname_5 where aolevel=5;
select formalname,offname,shortname from temp1 into _formalname_6,_offname_6,_shortname_6 where aolevel=6;
select formalname,offname,shortname from temp1 into _formalname_7,_offname_7,_shortname_7 where aolevel=7;
select formalname,offname,shortname from temp1 into _formalname_90,_offname_90,_shortname_90 where aolevel=90;
select formalname,offname,shortname from temp1 into _formalname_91,_offname_91,_shortname_91 where aolevel=91;




-- возвращаем результат
return query (select _formalname_1, _offname_1, _shortname_1,
_formalname_2, _offname_2, _shortname_2,
_formalname_3, _offname_3, _shortname_3,
_formalname_4, _offname_4, _shortname_4,
_formalname_5, _offname_5, _shortname_5,
_formalname_6, _offname_6, _shortname_6,
_formalname_7, _offname_7, _shortname_7,
_formalname_90, _offname_90, _shortname_90,
_formalname_91, _offname_91, _shortname_91,
_postalcode, _housenum, _buidnum, _strucnum, _strstatus);

-- удаляем временную таблицу
drop table temp1 ;

--пример вызова 
--select * from get_full_address('391a42fe-ec31-4a67-b234-2f4bf9b7f20b');

end;

$BODY$
  LANGUAGE plpgsql VOLATILE SECURITY DEFINER
  COST 100;
...
Рейтинг: 0 / 0
ФИАС - функция или представление данных.
    #39092417
YurikGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итог... вдруг кому понадобится

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
CREATE OR REPLACE FUNCTION get_full_address_new (IN _houseguid text)
  RETURNS TABLE(formalname_1 text, offname_1 text, shortname_1 text, formalname_2 text, offname_2 text, shortname_2 text, formalname_3 text, offname_3 text, shortname_3 text, formalname_4 text, offname_4 text, shortname_4 text, formalname_5 text, offname_5 text, shortname_5 text, formalname_6 text, offname_6 text, shortname_6 text, formalname_7 text, offname_7 text, shortname_7 text, formalname_90 text, offname_90 text, shortname_90 text, formalname_91 text, offname_91 text, shortname_91 text, postalcode text, housenum text, buidnum text, strucnum text, strstatus integer) AS
$BODY$

DECLARE _aoguid text;
DECLARE _formalname_temp text; DECLARE _offname_temp text; DECLARE _shortname_temp text; _aolevel integer;
DECLARE _formalname_1 text; DECLARE _offname_1 text; DECLARE _shortname_1 text;
DECLARE _formalname_2 text; DECLARE _offname_2 text; DECLARE _shortname_2 text;
DECLARE _formalname_3 text; DECLARE _offname_3 text; DECLARE _shortname_3 text;
DECLARE _formalname_4 text; DECLARE _offname_4 text; DECLARE _shortname_4 text;
DECLARE _formalname_5 text; DECLARE _offname_5 text; DECLARE _shortname_5 text;
DECLARE _formalname_6 text; DECLARE _offname_6 text; DECLARE _shortname_6 text;
DECLARE _formalname_7 text; DECLARE _offname_7 text; DECLARE _shortname_7 text;
DECLARE _formalname_90 text; DECLARE _offname_90 text; DECLARE _shortname_90 text;
DECLARE _formalname_91 text; DECLARE _offname_91 text; DECLARE _shortname_91 text;
DECLARE _postalcode text; 
DECLARE _housenum text; 
DECLARE _buidnum text; 
DECLARE _strucnum text;
DECLARE _strstatus integer;
DECLARE _parentguid text;


BEGIN
-- процедура возвращает адрес в виде таблицы

-- ищем aoguid адресного элемента, к которому относится дом, а также прочие параметры дома для отображения.
select house02.aoguid, house02.postalcode,house02.housenum,house02.buildnum,house02.strucnum,house02.strstatus
from house02 
where house02.houseguid=_houseguid 
into _aoguid, _postalcode,_housenum,_buidnum,_strucnum,_strstatus;

-- выполняем циклические запросы, пока не дойдем до верха дерева
while not (_aoguid='') loop
  select formalname,offname,shortname,aolevel, parentguid   
    from addrobj 
    where aoguid=_aoguid
    into _formalname_temp,_offname_temp,_shortname_temp, _aolevel, _parentguid;
    _aoguid=_parentguid;
   if _aolevel=1 then _formalname_1=_formalname_temp; _offname_1=_offname_temp; _shortname_1=_shortname_temp;
   elseif _aolevel=2 then _formalname_2=_formalname_temp; _offname_2=_offname_temp; _shortname_2=_shortname_temp;
   elseif _aolevel=3 then _formalname_3=_formalname_temp; _offname_3=_offname_temp; _shortname_3=_shortname_temp;
   elseif _aolevel=4 then _formalname_4=_formalname_temp; _offname_4=_offname_temp; _shortname_4=_shortname_temp;
   elseif _aolevel=5 then _formalname_5=_formalname_temp; _offname_5=_offname_temp; _shortname_5=_shortname_temp;
   elseif _aolevel=6 then _formalname_6=_formalname_temp; _offname_6=_offname_temp; _shortname_6=_shortname_temp;
   elseif _aolevel=7 then _formalname_7=_formalname_temp; _offname_7=_offname_temp; _shortname_7=_shortname_temp;
   elseif _aolevel=90 then _formalname_90=_formalname_temp; _offname_90=_offname_temp; _shortname_90=_shortname_temp;
   elseif _aolevel=91 then _formalname_91=_formalname_temp; _offname_91=_offname_temp; _shortname_91=_shortname_temp;
   end if; 
    

    
end loop;



-- возвращаем результат
return query (select _formalname_1, _offname_1, _shortname_1,
_formalname_2, _offname_2, _shortname_2,
_formalname_3, _offname_3, _shortname_3,
_formalname_4, _offname_4, _shortname_4,
_formalname_5, _offname_5, _shortname_5,
_formalname_6, _offname_6, _shortname_6,
_formalname_7, _offname_7, _shortname_7,
_formalname_90, _offname_90, _shortname_90,
_formalname_91, _offname_91, _shortname_91,
_postalcode, _housenum, _buidnum, _strucnum, _strstatus);


--пример вызова 
--select * from get_full_address_new('391a42fe-ec31-4a67-b234-2f4bf9b7f20b');


end;

$BODY$
  LANGUAGE plpgsql VOLATILE SECURITY DEFINER;
...
Рейтинг: 0 / 0
ФИАС - функция или представление данных.
    #39092493
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YurikGL,

осторожно интересуюсь :

зачем вам столько блоков declare в вашем поделии ? вы не асилили доки по plpgsql ? или просто любите красивые слова ?
...
Рейтинг: 0 / 0
ФИАС - функция или представление данных.
    #39092690
YurikGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqYurikGL,

осторожно интересуюсь :
зачем вам столько блоков declare в вашем поделии ? вы не асилили доки по plpgsql ? или просто любите красивые слова ?

С удовольствием сделаю более читабельно. :)
...
Рейтинг: 0 / 0
ФИАС - функция или представление данных.
    #39092716
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YurikGL,

а Вы ФИАС принципиально из DBF берёте?
...
Рейтинг: 0 / 0
ФИАС - функция или представление данных.
    #39092720
YurikGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YurikGL,
Собственно...

авторDECLARE _aoguid text;
_formalname_temp text; _offname_temp text; _shortname_temp text; _aolevel integer;
_formalname_1 text; _offname_1 text; _shortname_1 text;
_formalname_2 text; _offname_2 text; _shortname_2 text;
_formalname_3 text; _offname_3 text; _shortname_3 text;
_formalname_4 text; _offname_4 text; _shortname_4 text;
_formalname_5 text; _offname_5 text; _shortname_5 text;
_formalname_6 text; _offname_6 text; _shortname_6 text;
_formalname_7 text; _offname_7 text; _shortname_7 text;
_formalname_90 text; _offname_90 text; _shortname_90 text;
_formalname_91 text; _offname_91 text; _shortname_91 text;
_postalcode text;
_housenum text;
_buidnum text;
_strucnum text;
_strstatus integer;
_parentguid text;


Лучше? Есть что еще улучшить?
...
Рейтинг: 0 / 0
ФИАС - функция или представление данных.
    #39092721
YurikGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadster,

В DBF по регионам дома раскиданы. Удобно.
...
Рейтинг: 0 / 0
ФИАС - функция или представление данных.
    #39092725
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YurikGLroadster,

В DBF по регионам дома раскиданы. Удобно.а в XML не раскиданы?
на мой взгляд очень странно брать формат, который умирает.
а при обработке XML (впрочем при обработке DBF тоже) можно положить данные так как вам удобно будет в использовании. есть другой вариант - оставить структуру для обеспечения простоты загрузки, но понаписать вьюх, какие будут удобны (скорость не устраивает? строим матвью.) и уже их использовать в работе. думается мне тогда можно будет и селектами обходиться.
...
Рейтинг: 0 / 0
ФИАС - функция или представление данных.
    #39092741
YurikGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadsterYurikGLroadster,

В DBF по регионам дома раскиданы. Удобно.а в XML не раскиданы?
на мой взгляд очень странно брать формат, который умирает.
а при обработке XML (впрочем при обработке DBF тоже) можно положить данные так как вам удобно будет в использовании. есть другой вариант - оставить структуру для обеспечения простоты загрузки, но понаписать вьюх, какие будут удобны (скорость не устраивает? строим матвью.) и уже их использовать в работе. думается мне тогда можно будет и селектами обходиться.

Насколько видел - не раскиданы. Могу ошибаться, а качать гигабайты для проверки, честно, лень.
Я заливал через FullConvert. Залил все (дома и доки только по Башкирии), потом делетами удалил ненужное. Построил индексы.
Вся процедура для Республики Башкортостан заняла минут 30.
Обновлять потом и с xml можно.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / ФИАС - функция или представление данных.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]