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

Есть функция name_find(), внутри работает запрос SELECT, результат запроса на выходе функции.

Затем select name_find(); выводит тоже что и обычный SELECT.

Возможно ли не обьявлять сколько и какие столбцы должны выводится. Т.к. Функция нужна именно для того чтоб в зависимости от внешних факторов выводить разные комбинации колонок. Точно знаю что это можно делать в MSSQL. В PostgreSQL нашел много вариантов реализации данной задачи, но ни чего не подходит 100%. В интеренете ничего кроме своих же вопросов не нахожу.

Спасибо за любую помощь.
...
Рейтинг: 0 / 0
функция возвращающая множество строк
    #35164916
Ilya Anfimov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, в dblink как-то сделали...
...
Рейтинг: 0 / 0
функция возвращающая множество строк
    #35165208
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
CREATE OR REPLACE FUNCTION dblink_fetch (text, int)
RETURNS setof record
тип результата указывается при получении результата:
Код: plaintext
1.
 test=# select * from dblink_fetch('foo',  5 ) as (funcname name, source text);

вместо функции возвращающей setof record можно делать временные view, можно использовать курсоры


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
функция возвращающая множество строк
    #35165471
СироП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за участие.

Код: plaintext
test=# select * from dblink_fetch('foo',  5 ) as (funcname name, source text);

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

Ёш
вместо функции возвращающей setof record можно делать временные view, можно использовать курсоры



покажите пример использования курсоров или view.
...
Рейтинг: 0 / 0
функция возвращающая множество строк
    #35165612
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СироПпокажите пример использования курсоров или view.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
seb=> create or replace function make_data_view(t text) returns void as $$begin execute 'create temp view data_view as select * from ' || quote_ident(t); end$$ language plpgsql;
CREATE FUNCTION
seb=> create or replace function clean_data_view(t text) returns void as $$begin drop view data_view; end$$ language plpgsql;
CREATE FUNCTION
seb=> begin;

seb=> select make_data_view('pg_user');
seb=> select * from data_view ;
seb=> select clean_data_view('pg_user');

seb=> select make_data_view('pg_locks');
seb=> select * from data_view ;
seb=> select clean_data_view('pg_locks');

seb=> end;
результат выборки из data_view будет разный, с разным кол-вом и типом столбцов.

для курсоров - тоже самое, только вместо create temp view нужно declare cursor for query

DECLARE -- define a cursor
...
Рейтинг: 0 / 0
функция возвращающая множество строк
    #35165614
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СироПв моем случае при вызове функции также не известно какие данные должны быть полученыэто Вы имхо преувеличиваете :) что-то про возвращаемые даные Вам всёж таки известно быть должно :)
...
Рейтинг: 0 / 0
функция возвращающая множество строк
    #35166028
PRTW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример работы с курсорами.

Такая задача: показать на странице статистику обращений к сайту за период в разных разрезах - по времени, по адресам и по браузерам.
Код: plaintext
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.
create table stat (
  ts timestamp,
  ip inet,
  ua text,
  uri text
);

create or replace function get_stat(time_from timestamp, time_to timestamp)
returns setof refcursor
language plpgsql as $BODY$
declare
  by_day cursor is
    select ts::date as "День",count(*) as "Запросов"
    from stat
    where ts between time_from and time_to
    group by ts::date
    order by  1 ;
  by_host cursor is
    select ip as "Адрес",count(*) as "Запросов"
    from stat
    where ts between time_from and time_to
    group by ip
    order by count(*) desc;
  by_browser cursor is
    select ua as "Браузер",count(*) as "Запросов"
    from stat
    where ts between time_from and time_to
    group by ua
    order by count(*) desc;
begin
  open by_day; return next by_day;
  open by_host; return next by_host;
  open by_browser; return next by_browser;
end;
$BODY$;

#-------------------в приложении (псевдокод)-------------------------
# открываем транзакцию
connection.begin_transaction
# получаем набор имен курсоров (aka portal names)
stat = connection.execute("SELECT * FROM get_stat('2008-02-01', '2008-02-29 23:59')")
# теперь ходим по нему и извлекаем данные
while (row = stat.fetch) do
    # извлекаем данные по полученному имени курсора
    ds = connection.execute("FETCH ALL FROM " + row[ 0 ]) 
    # формируем HTML-табличку по набору данных ds
  ...
end
# закрываем транзакцию
connection.commit
# показываем результат
...
Если в будущем будет добавляться другая статистика, то в коде веб-приложения не придется менять ни строчки. Достаточно изменить хранимую функцию.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / функция возвращающая множество строк
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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