powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / курсор в функции
4 сообщений из 4, страница 1 из 1
курсор в функции
    #38823163
Trippal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые форумчане, доброго времени суток.

Есть необходимость собрать следующую картину:

Функция

CREATE OR REPLACE FUNCTION aaa() RETURNS SETOF TEXT AS
$$
BEGIN
RETURN query (SELECT t1.info1
FROM public.t1,public.t2
WHERE public.st_intersects(t1.geom, t2.geom)
and t2.geom = 'координаты');
RETURN query (SELECT t1.info2
FROM public.t1, public.t2
WHERE public.st_intersects(t1.geom, t2.geom)
and t2.geom = 'координаты');
RETURN query (SELECT t1.info3
FROM public.t1, public.t2
WHERE public.st_intersects(t1.geom, t2.geom)
and t2.geom = 'координаты');
END
$$ LANGUAGE plpgsql;

Выдает следующую информацию
______aaa_____
1 | info1
2 | info2
3 | info3

Суть такова, что для t2.geom = 'координаты' необходимо собрать курсор, чтобы при его выполнении выполнялась и функция
Ума не приложу, как он должен выглядеть.
По моему пониманию, сначала необходимо создать сам курсор, который будет действовать в рамках t2.geom
затем, результаты его выполнения будут вноситься в функцию и вместо t2.geom = 'координаты' будет по смыслу t2.geom = курсор. Так ли это?
и как их увязать?

Заранее спасибо.
...
Рейтинг: 0 / 0
курсор в функции
    #38823164
Trippal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
координаты везде единые
...
Рейтинг: 0 / 0
курсор в функции
    #38823180
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Trippal,

У вас пример возвращаемых данных не соответствует определению функцию, проверьте.

Если координаты одинаковы, то незачем и с курсорами возиться. Задачу можно решить таким запросом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
WITH i AS (
  SELECT t1.info1, t1.info2, t1.info3
    FROM public.t1, public.t2
   WHERE public.st_intersects(t1.geom, t2.geom)
    AND t2.geom = 'координаты'
)
SELCT info1 FROM i
UNION ALL
SELECT info2 FROM i
UNION ALL
SELECT info3 FROM i;


Я использовал именованный подзапрос , он всегда исполняется только один раз в Postgres. Ну а потом обращаюсь к нему 3 раза для получения результата.
Соответственно, это все оборачивается в PL/SQL функцию.

Основное правило — если есть возможность обойтись просто запросом, то не стоит городить функции — они требуют времени на обработку. Если функции неизбежны, то старайтесь обойтись PL/SQL — они оптимизируются. PL/pgSQL (и любой другой не-SQL язык) является черным ящиком для оптимизатора.
...
Рейтинг: 0 / 0
курсор в функции
    #38823545
Trippal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,
спасибо большое, последую Вашему совету.
Очень помогли.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / курсор в функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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