powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сколько раз выполняется функция?
9 сообщений из 9, страница 1 из 1
Сколько раз выполняется функция?
    #38523424
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть функция:
Код: sql
1.
2.
3.
4.
5.
CREATE OR REPLACE FUNCTION public.tail
(INT, INT)
RETURNS TABLE (p INT, m DECIMAL) AS $$
...
$$ LANGUAGE SQL;



Вопрос: эта функция выполниться сколько раз, если значения одинаковые?

Код: sql
1.
SELECT public.tail(x,y).p, public.tail(x,y).m FROM table;



Выполнить запрос
Код: sql
1.
SELECT * FROM public.tail(100, 20)

не всегда получается
...
Рейтинг: 0 / 0
Сколько раз выполняется функция?
    #38523444
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2й вопрос:
Так делется:
Код: sql
1.
SELECT (public.tail(x, y)).p FROM table


А так не получается сделать:
Код: sql
1.
SELECT SUM((public.tail(x, y)).p) FROM table


Кто объяснит, почему найти сумму нельзя

Спасибо всем за ответы!
...
Рейтинг: 0 / 0
Сколько раз выполняется функция?
    #38523498
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContraЕсть функция:
Код: sql
1.
2.
3.
4.
5.
CREATE OR REPLACE FUNCTION public.tail
(INT, INT)
RETURNS TABLE (p INT, m DECIMAL) AS $$
...
$$ LANGUAGE SQL;



Вопрос: эта функция выполниться сколько раз, если значения одинаковые?

Код: sql
1.
SELECT public.tail(x,y).p, public.tail(x,y).m FROM table;



Выполнить запрос
Код: sql
1.
SELECT * FROM public.tail(100, 20)

не всегда получается

два раза выполняется... ровно столько сколько вы написали...
а что значит "не всегда получается вполнить запрос"?

PS: а функция у вас собственно сколько строк возвращает?
...
Рейтинг: 0 / 0
Сколько раз выполняется функция?
    #38523499
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContra2й вопрос:
Так делется:
Код: sql
1.
SELECT (public.tail(x, y)).p FROM table


А так не получается сделать:
Код: sql
1.
SELECT SUM((public.tail(x, y)).p) FROM table


Кто объяснит, почему найти сумму нельзя

Спасибо всем за ответы!

вы бы чтоли ошибку возвращаемую бы приводили...?
но 99% что проблема в "RETURNS TABLE"
что опять же возвращает к вопросу сколько строк функция возвращает...
...
Рейтинг: 0 / 0
Сколько раз выполняется функция?
    #38524112
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContraЕсть функция:
Код: sql
1.
2.
3.
4.
5.
CREATE OR REPLACE FUNCTION public.tail
(INT, INT)
RETURNS TABLE (p INT, m DECIMAL) AS $$
...
$$ LANGUAGE SQL;




Вопрос: эта функция выполниться сколько раз, если значения одинаковые?
Зависит от... Если IMMUTABLE, то может и один.PCContraВыполнить запрос
Код: sql
1.
SELECT * FROM public.tail(100, 20)


не всегда получаетсяА это неправда.
Код: sql
1.
SELECT * FROM ( SELECT public.tail(x, y) FROM table ) AS foo

Короче всегда можно обернуть еще раз SELECT'ом.
...
Рейтинг: 0 / 0
Сколько раз выполняется функция?
    #38524171
AndreiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PCContraВопрос: эта функция выполниться сколько раз, если значения одинаковые?
Код: sql
1.
SELECT public.tail(x,y).p, public.tail(x,y).m FROM table;



Если я правильно понял и x, y - поля таблицы, то функция выполнится два раза для каждой строки из таблицы "table".
Что бы избежать двойного выполнения функции можно воспользоваться конструкцией lateral , которая появилась в 9.3:
Код: sql
1.
2.
3.
select t.p, t.m
  from table
  cross join lateral tail(x, y) t;

lateral вообще очень интересная вещь т.к. позволяет не только вызывать функции, но и выполнять подзапросы, подробней здесь

PCContraА так не получается сделать:
Код: sql
1.
SELECT SUM((public.tail(x, y)).p) FROM table


конечно не получится, агрегатные функции принимают в качестве аргумента значение, а вы пытаетесь передать ей набор значений
Код: sql
1.
select sum((select sum(p) from tail(x, y))) from table 


PS immutable конечно помогает, но иногда планировщик все равно решает выполнить ф-ию два раза, поэтому лучше использовать lateral ведь его именно для этого и придумали )
...
Рейтинг: 0 / 0
Сколько раз выполняется функция?
    #38524959
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Maxim BogukPCContra2й вопрос:
Так делется:
Код: sql
1.
SELECT (public.tail(x, y)).p FROM table


А так не получается сделать:
Код: sql
1.
SELECT SUM((public.tail(x, y)).p) FROM table


Кто объяснит, почему найти сумму нельзя

Спасибо всем за ответы!

вы бы чтоли ошибку возвращаемую бы приводили...?
но 99% что проблема в "RETURNS TABLE"
что опять же возвращает к вопросу сколько строк функция возвращает...
Ошибка SQL:

ERROR: set-valued function called in context that cannot accept a set

В операторе:

SELECT SUM((public.tail(x, y)).p) FROM table
2) Да, таблица "table" содержит колонки x, y
3) Maxim BogukPS: а функция у вас собственно сколько строк возвращает?
ровно одну строку. В данном случае функция возвращает столько строк ( как Вы уже поняли) сколько строк в "table"
4) AndreiSQL конечно не получится, агрегатные функции принимают в качестве аргумента значение, а вы пытаетесь передать ей набор значенийА на мой взгляд я передаю ей 1 конкретное значение -(public.tail(x, y)) .p
5) lateral. Боюсь я новинок. С багами, небось...
6) Warstone Короче всегда можно обернуть еще раз SELECT'ом. Так и сделал, почти: WITH t() AS (SELECT ... ) SELECT ...
...
Рейтинг: 0 / 0
Сколько раз выполняется функция?
    #38524995
как надо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PCContra<>
4) AndreiSQL конечно не получится, агрегатные функции принимают в качестве аргумента значение, а вы пытаетесь передать ей набор значенийА на мой взгляд я передаю ей 1 конкретное значение -(public.tail(x, y)) .p
<>гм, что происходит на ваш взгляд - совершенно неважно, за его (взгляда) полной неадекватностью.
дело не в поле, а в объявлении ф-ии.

чтобы постгресс считал, что вы возвращаете 1 запись, а не набор, вам RETURNS TABLE (....) который эквивалентен RETURNS SETOF RECORD заменить на RETURNS RECORD.

понятно, что удобного синтаксиса[RETURNS RECORD (a int , b text)], как в случае с RETURNS TABLE вам не предоставят (как и return query внутри), ну так через out параметры опишете.
...
Рейтинг: 0 / 0
Сколько раз выполняется функция?
    #38525115
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContra,

авторровно одну строку.

RETURNS TABLE это не одна строка... это набор из N строк (таблица) которая у вас случайно N=1.

Если функция возвращает 1 строку ее не надо как RETURNS TABLE обьявлять никогда...
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сколько раз выполняется функция?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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