powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вызов функции, которая возвращает таблицу для каждой строки исходной таблицы
16 сообщений из 16, страница 1 из 1
Вызов функции, которая возвращает таблицу для каждой строки исходной таблицы
    #33133131
Carrie2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Исходные данные: есть исходная таблица t, есть sql (или plsql - не суть) функция f с параметрами, результат которой - таблица.

Проблема: Нужно пробежаться по таблице t, вызывая для каждой строки функцию f с параметрами - значениями некоторых столбцов из текущей строки -, и получить в итоге одну новую таблицу. Или я туплю, или такое можно написать только функцией на plsql, используя cursor, return next. Хотелось бы sql-запросом.
...
Рейтинг: 0 / 0
Вызов функции, которая возвращает таблицу для каждой строки исходной таблицы
    #33133236
мафик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
http://www.postgresql.org/docs/8.0/interactive/sql-select.html

примеры внизу страницы начинающиеся таким текстом

This example shows how to use a function in the FROM clause, both with and without a column definition list:

так же никто не запрещает во FROM использовать другой SELECT
...
Рейтинг: 0 / 0
Вызов функции, которая возвращает таблицу для каждой строки исходной таблицы
    #33133240
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только функцией. Такая штука (т.е. вызов функции на каждую строку с передачей знечений в параметры) имеется по-крайней мере в Sybase ASA (называется LATERAL JOIN), но в постгресе ещё не реализована.
...
Рейтинг: 0 / 0
Вызов функции, которая возвращает таблицу для каждой строки исходной таблицы
    #33133255
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мафиктак же никто не запрещает во FROM использовать другой SELECT
это не совсем то, о чём Carrie2 спрашивает. Функцию во FROM получится вызвать только с константными параметрами.
...
Рейтинг: 0 / 0
Вызов функции, которая возвращает таблицу для каждой строки исходной таблицы
    #33133340
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это конечно с точки зрения здравого смысла (в плане использования пример бредовый) но с точки зрения наглядности наверное подойдет

Код: plaintext
1.
2.
SELECT 
 * 
FROM up_auth.obj_permissions_list((SELECT user_id FROM up_auth.users WHERE user_id =  43 ))
...
Рейтинг: 0 / 0
Вызов функции, которая возвращает таблицу для каждой строки исходной таблицы
    #33133346
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
бляха муха
хотел просмотреть и запостил

не то что надо ...

ща подумаем
...
Рейтинг: 0 / 0
Вызов функции, которая возвращает таблицу для каждой строки исходной таблицы
    #33133430
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ффффФункцию во FROM получится вызвать только с константными параметрами

не совсем так

вот

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT 
  * 
FROM 
  (
  SELECT 
    up_auth.obj_permissions_list(user_id) AS f1, login AS f2
  FROM 
    up_auth.users
  ) AS t

up_auth.users содержит > 1 записи правда результат не совсем корректный ;-))
____f1_____|___f2_____
(7,1,0,0,0) | vfabr
(11,0,1,0,0)| mihon

obj_permissions_list возвращает SETOF

я просто когда-то нечто подобное делал вот немогу найти что :-( и когда ;-)
...
Рейтинг: 0 / 0
Вызов функции, которая возвращает таблицу для каждой строки исходной таблицы
    #33133438
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Carrie2Исходные данные: есть исходная таблица t, есть sql (или plsql - не суть) функция f с параметрами, результат которой - таблица.

Проблема: Нужно пробежаться по таблице t, вызывая для каждой строки функцию f с параметрами - значениями некоторых столбцов из текущей строки -, и получить в итоге одну новую таблицу. Или я туплю, или такое можно написать только функцией на plsql, используя cursor, return next. Хотелось бы sql-запросом.
курсор в "непосредственном" виде наверное не нужен. нужна аналогичная ему конструкция FOR ххх IN SELECT ххх LOOP
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
--это цикл по записям таблицы
FOR ххх IN SELECT ххх LOOP   
    -- тут рыбку и завернем - 
    --это цикл по записям ф-ии
    FOR ххх IN SELECT ххх LOOP
         ....
         return NEXT xxx;
    END LOOP
END LOOP
...
Рейтинг: 0 / 0
Вызов функции, которая возвращает таблицу для каждой строки исходной таблицы
    #33133633
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vfabr
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT 
  * 
FROM 
  (
  SELECT 
    up_auth.obj_permissions_list(user_id) AS f1, login AS f2
  FROM 
    up_auth.users
  ) AS t
 


Разве такое возможно с pl/prsql? Можно, используя функцию на C
и perl. Правда видел патч, который может похерить в перле эту классную
возможность в угоду устранения дуплицирования набора данных. Это тоже
хорошо, но терять уникальную возможность нехочется.
...
Рейтинг: 0 / 0
Вызов функции, которая возвращает таблицу для каждой строки исходной таблицы
    #33133864
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а никто и не писал что это plpgsql $-))

вообщем это sql функция но я думаю можно как нить обойти или сделать это и с plpgsql

можно попробовать

кстати может посоветовать человеку view ??
...
Рейтинг: 0 / 0
Вызов функции, которая возвращает таблицу для каждой строки исходной таблицы
    #33134010
Meta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Carrie2Исходные данные: есть исходная таблица t, есть sql (или plsql - не суть) функция f с параметрами, результат которой - таблица.

Проблема: Нужно пробежаться по таблице t, вызывая для каждой строки функцию f с параметрами - значениями некоторых столбцов из текущей строки -, и получить в итоге одну новую таблицу. Или я туплю, или такое можно написать только функцией на plsql, используя cursor, return next. Хотелось бы sql-запросом.

Можно использовать и функцию, и сложный sql запрос. Смотря, какой результат тебе нужен. Возможно, всё это можно сделать и одним запросом без использования функции. Если уточнишь исходные данные, думаю, получишь более вразумительные ответы :)
...
Рейтинг: 0 / 0
Вызов функции, которая возвращает таблицу для каждой строки исходной таблицы
    #33134241
Carrie2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Упрощенный пример.

CREATE TABLE t1 (num INT);
COPY t1 (num) FROM stdin;
4
1
\.

CREATE TABLE t2 (f1 INT, f2 INT, f3 INT);

CREATE FUNCTION f1(INT) RETURNS SETOF t2 AS '
SELECT $1*2, $1*4, $1*8
UNION ALL
SELECT $1*3, $1*6, $1*9;
' LANGUAGE SQL;

Вот такой запрос ес-но не может быть, но какой результат мне от него хотелось бы получить - думаю понятно:
select f1(num) FROM t1;

Результат что-то вроде:
8 16 32
12 24 36
2 4 8
3 6 9

2vfabr: где тут поможет view? Так же не понимаю во втором вашем примере как удалось функцию up_auth.obj_permissions_list, возвращающую setof, "запихнуть" в SELECT и каким образом получился такой "странный" результат.

P.S.: Реализовывать функцией на pl/pgsql пробовал (ес-но используя FOR ххх IN SELECT ххх LOOP ) - очень медленно, на больших объемах данных это заметно.
...
Рейтинг: 0 / 0
Вызов функции, которая возвращает таблицу для каждой строки исходной таблицы
    #33134321
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а зачем таблица t2?

вообщем если тебе действительно нужен ответ на вопрос что тебе нужно то не поленись написать полный вариант задачи (даже можно наверное без таблиц и запросов)

ну например
у меня есть входной поток данных таких то на выходе нужно получить то то и это нужно затем то
...
Рейтинг: 0 / 0
Вызов функции, которая возвращает таблицу для каждой строки исходной таблицы
    #33134326
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и еще версию сервера напиши

я все на 8 пробую
...
Рейтинг: 0 / 0
Вызов функции, которая возвращает таблицу для каждой строки исходной таблицы
    #33134513
Carrie2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дык чем мой предыдущий пост не пример? "Трансформирую" одну таблицу с помощью функции f1 в другую. В реальной задачи смысл будет точно такой же.

В общем LATERAL JOIN из Sybase - это то, что нужно.

P.S.: Таблица t2 нужна только чтобы для функции сказать RETURNS SETOF t2. Версия postgres'а - 7.4
...
Рейтинг: 0 / 0
Вызов функции, которая возвращает таблицу для каждой строки исходной таблицы
    #33134656
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если вы хотите просто найти "лопату" для решения вашей проблемы тогда только могу отослать вас в мануал если хотите спросить совета как подступицца к проблеме тогда говорите то что вам нужно сделать

почему входной поток это 1 колонка? может можно его сразу преобразовать в то что надо еще на клиенте, например, который этот самый поток пишет в базу, а может это не поток, а какая-то таблица которую вы не в силах переделать или еще что ...

в том что вы привели можно сделать так и я не вижу необходимости делать функцию

SELECT t_1.num*2, t_1.num*4, t_1.num*8 FROM t1 AS t_1
UNION ALL
SELECT t_2.num*3, t_2.num*6, t_2.num*9 FROM t1 AS t_2

ну зачем это надо я всеравно не пойму ...

потом можно обернуть все это дело во вьюху (незнаю правда есть ли они в 7 постгресе и лень смотреть)
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вызов функции, которая возвращает таблицу для каждой строки исходной таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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