Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / функция возвращающая множество строк / 7 сообщений из 7, страница 1 из 1
01.03.2008, 13:53
    #35164901
СироП
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функция возвращающая множество строк
Помогите составить функцию возвращающую множество строк.

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

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

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

Спасибо за любую помощь.
...
Рейтинг: 0 / 0
01.03.2008, 14:19
    #35164916
Ilya Anfimov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функция возвращающая множество строк
Ну, в dblink как-то сделали...
...
Рейтинг: 0 / 0
01.03.2008, 19:54
    #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
02.03.2008, 11:01
    #35165471
СироП
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функция возвращающая множество строк
Спасибо за участие.

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

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

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



покажите пример использования курсоров или view.
...
Рейтинг: 0 / 0
02.03.2008, 14:41
    #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
02.03.2008, 14:44
    #35165614
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функция возвращающая множество строк
СироПв моем случае при вызове функции также не известно какие данные должны быть полученыэто Вы имхо преувеличиваете :) что-то про возвращаемые даные Вам всёж таки известно быть должно :)
...
Рейтинг: 0 / 0
03.03.2008, 04:20
    #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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / функция возвращающая множество строк / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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