Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / setof, return next - чёто не могу разобраться / 13 сообщений из 13, страница 1 из 1
03.12.2006, 18:36
    #34173135
aov
aov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setof, return next - чёто не могу разобраться
вот такая вот функция имеется:
Код: 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.
create or replace function zak.zak_tochek_sel(date,date) returns setof zak.vw_zak_tochek as
$$
declare 
	_start date;_end date;
	_rows zak.vw_zak_tochek%rowtype;
begin
	if $ 1  is null then 
		_start := date(date_part('year',now())||'-'||date_part('month',now())||'-01');
	else
		_start := $ 1 ;
	end if;
	if $ 2  is null then 
		_end := date(date(date_part('year',now())||'-'||date_part('month',now())||'-01')+interval '1 month' - interval '1 day');
	else
		_end := $ 2 ;
	end if;
	raise notice 'start=%', to_char(_start,'dd.mm.yy');
	raise notice 'end=%', to_char(_end,'dd.mm.yy');
	select * into _rows from zak.vw_zak_tochek
		where data >=_start and data<=_end;
	return next _rows;
end
$$
language plpgsql;
и от неё я ожидаю, что она выборку делать будет из вьюва - уж и не знаю почему этого именно ожидаю :). но она возвращает токо одну строку :(. критерии как выяснилось тут не при чём - правильно с ними всё. тут проблема в том наверное что не понял я етого setof, return next. как же сделать что нужно мне? т.е. мне нужна выборка за текущий месяц если не заданы параметры начала и конца периода - и за указанный период если они заданы. параметры будут полюбому в функцию передаваться (ввиду специфики клиента) - так что просто на скл допустим с перегрузкой функций - такое никак не сделать. помогите плз!
...
Рейтинг: 0 / 0
03.12.2006, 19:28
    #34173164
ZemA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setof, return next - чёто не могу разобраться
а если так
Код: 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.
create or replace function zak.zak_tochek_sel(date,date) returns setof zak.vw_zak_tochek as
$$
declare 
	_start date;_end date;
	_rows zak.vw_zak_tochek%rowtype;
begin
	if $ 1  is null then 
		_start := date(date_part('year',now())||'-'||date_part('month',now())||'-01');
	else
		_start := $ 1 ;
	end if;
	if $ 2  is null then 
		_end := date(date(date_part('year',now())||'-'||date_part('month',now())||'-01')+interval '1 month' - interval '1 day');
	else
		_end := $ 2 ;
	end if;
	raise notice 'start=%', to_char(_start,'dd.mm.yy');
	raise notice 'end=%', to_char(_end,'dd.mm.yy');
	select * into _rows from zak.vw_zak_tochek
		where data >=_start and data<=_end;
	return next _rows;
	return;
end
$$
language plpgsql;
...
Рейтинг: 0 / 0
03.12.2006, 19:51
    #34173179
СергейК
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setof, return next - чёто не могу разобраться
aovвот такая вот функция имеется:
Код: plaintext
1.
2.
3.
	select * into _rows from zak.vw_zak_tochek
		where data >=_start and data<=_end;
	return next _rows;


Vam nado ispolzovat' tsykl
http://www.postgresql.org/docs/8.1/static/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING
Код: plaintext
1.
2.
3.
FOR _rows IN select * from .... LOOP
    return next _rows;
end
...
Рейтинг: 0 / 0
03.12.2006, 19:59
    #34173187
ZemA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setof, return next - чёто не могу разобраться
СергейК aovвот такая вот функция имеется:
Код: plaintext
1.
2.
3.
	select * into _rows from zak.vw_zak_tochek
		where data >=_start and data<=_end;
	return next _rows;


Vam nado ispolzovat' tsykl
http://www.postgresql.org/docs/8.1/static/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING
Код: plaintext
1.
2.
3.
FOR _rows IN select * from .... LOOP
    return next _rows;
end

мда, слона-то я и не заметил =)
...
Рейтинг: 0 / 0
03.12.2006, 21:26
    #34173249
aov
aov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setof, return next - чёто не могу разобраться
ZemAмда, слона-то я и не заметил =)
да я не то чтобы не заметил слона этого - просто о нём не знал :).
вот оно как оказывается . . .
не пойму что-то логики - почему же писать надо returns setof xxx - а не returns xxx? сетоф - это разве не набор чего-то там? странно как-то . . .
ну да ладно. спасибо всем.

а вот ещё прикол - токо сильно не смейтесь. смейтесь - но не сильно :). короче такая штука:
Код: 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.
CREATE OR REPLACE FUNCTION end_if_null(date)
  RETURNS date AS
$BODY$
declare 
	_end date;
begin
	if $ 1  is null then 
		_end := date(date(date_part('year',now())||'-'||date_part('month',now())||'-01')+interval '1 month' - interval '1 day');
	else
		_end := $ 1 ;
	end if;
	return _end;
end
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

CREATE OR REPLACE FUNCTION start_if_null(date)
  RETURNS date AS
$BODY$
declare 
	_start date;
begin
	if $ 1  is null then 
		_start := date(date_part('year',now())||'-'||date_part('month',now())||'-01');
	else
		_start := $ 1 ;
	end if;
	return _start;
end
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

CREATE OR REPLACE FUNCTION zak.zak_tochek_sel(date, date)
  RETURNS SETOF zak.vw_zak_tochek AS
$BODY$
	select * from zak.vw_zak_tochek
		where data >=start_if_null($ 1 ) and data<=end_if_null($ 2 );
$BODY$
  LANGUAGE 'sql' VOLATILE;
ALTER FUNCTION zak.zak_tochek_sel(date, date) OWNER TO postgres;

select * from zak.zak_tochek_sel(null,null);
странно - но сейчас попробовал - нормально работает . . . а пол часа назад выдавало что я хотел - но токо одним столбцом почемуто. даже не знаю - может у меня башню сносит под вечер - но вроде до такой степени не могло! клянусь - оно лепило все столбцы в один через запятую - и в результате выводило токо один столбец. полтергейст прямо какой-то :). что бы это значило? пора лечиться, да? :)
...
Рейтинг: 0 / 0
03.12.2006, 21:29
    #34173252
aov
aov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setof, return next - чёто не могу разобраться
да - а как кстати думаете лучше делать - всё на plpgsql - или как во втором варианте? мне кажется второе быстрее должно работать чем тот странный цикл. кто как думает?
...
Рейтинг: 0 / 0
03.12.2006, 22:07
    #34173289
СергейК
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setof, return next - чёто не могу разобраться
aov
странно - но сейчас попробовал - нормально работает . . . а пол часа назад выдавало что я хотел - но токо одним столбцом почемуто. даже не знаю - может у меня башню сносит под вечер - но вроде до такой степени не могло! клянусь - оно лепило все столбцы в один через запятую - и в результате выводило токо один столбец. полтергейст прямо какой-то :). что бы это значило? пора лечиться, да? :)

Esli functsia vozvrashiaet sostavnoi tip, i vy vypolnite zapros:
Код: plaintext
1.
select your_function();
to togda u vas budet odin stolbets (sostavnogo tipa)
poetomu v takom sluchae nado delat'
Код: plaintext
1.
select * from your_function();
...
Рейтинг: 0 / 0
03.12.2006, 22:46
    #34173321
aov
aov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setof, return next - чёто не могу разобраться
о как. дошло. точнее - понял что это не полтергейст - и что со внимательностью у меня не очень - но крыша относительно в порядке :). вот интересно зачем в таком виде комуто селект этот может понадобиться? зачем то же это так сделано . . . теряюсь в догадках.
...
Рейтинг: 0 / 0
04.12.2006, 12:27
    #34174327
ZemA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setof, return next - чёто не могу разобраться
aov ZemAмда, слона-то я и не заметил =)
да я не то чтобы не заметил слона этого - просто о нём не знал :).

Я это не о вас, а о себе )
...
Рейтинг: 0 / 0
04.12.2006, 19:58
    #34175953
Jelis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setof, return next - чёто не могу разобраться
aovо как. дошло. точнее - понял что это не полтергейст - и что со внимательностью у меня не очень - но крыша относительно в порядке :). вот интересно зачем в таком виде комуто селект этот может понадобиться? зачем то же это так сделано . . . теряюсь в догадках.

Затем что после select перечисляються поля, по одному, а после from - таблицы. И select * from function() значит "выбрать все поля из такой-то таблицы". А select function() значит "выбрать одно поле".
За научно-техническую точность не ручаюсь, но популярным языком где-то примерно так :-)
...
Рейтинг: 0 / 0
04.12.2006, 20:01
    #34175960
Jelis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setof, return next - чёто не могу разобраться
aov
Код: 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.
CREATE OR REPLACE FUNCTION end_if_null(date)
  RETURNS date AS
$BODY$
declare 
	_end date;
begin
	if $ 1  is null then 
		_end := date(date(date_part('year',now())||'-'||date_part('month',now())||'-01')+interval '1 month' - interval '1 day');
	else
		_end := $ 1 ;
	end if;
	return _end;
end
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

CREATE OR REPLACE FUNCTION start_if_null(date)
  RETURNS date AS
$BODY$
declare 
	_start date;
begin
	if $ 1  is null then 
		_start := date(date_part('year',now())||'-'||date_part('month',now())||'-01');
	else
		_start := $ 1 ;
	end if;
	return _start;
end
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

CREATE OR REPLACE FUNCTION zak.zak_tochek_sel(date, date)
  RETURNS SETOF zak.vw_zak_tochek AS
$BODY$
	select * from zak.vw_zak_tochek
		where data >=start_if_null($ 1 ) and data<=end_if_null($ 2 );
$BODY$
  LANGUAGE 'sql' VOLATILE;
ALTER FUNCTION zak.zak_tochek_sel(date, date) OWNER TO postgres;

select * from zak.zak_tochek_sel(null,null);


К слову : функции start_if_null, end_if_null очень хорошие кандидаты для IMMUTABLE. В данном примере это особой разницы вроде не имеет, но на других запросах это может значительно повысить производительность.
...
Рейтинг: 0 / 0
05.12.2006, 00:35
    #34176237
aov
aov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setof, return next - чёто не могу разобраться
а что такое IMMUTABLE ? :)
...
Рейтинг: 0 / 0
05.12.2006, 11:43
    #34176944
Jelis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setof, return next - чёто не могу разобраться
aovа что такое IMMUTABLE ? :)

Тип функции :-)
http://www.postgresql.org/docs/8.1/interactive/sql-createfunction.html

IMMUTABLE - функция при одних и тех же параметрах возвращает одни и те же результаты (т.е. результат функии зависит ТОЛЬКО от параметров)
STABLE - результат функции зависит еще и от базы.
VOLATILE - результат функции зависит от погоды в Гондурасе :-)

По умолчанию все функции VOLATILE. Но VOLATILE функции в запросе не поддаються оптимизации, и должны вызываться каждый раз. А индексы можно строить только по IMMUTABLE функциям.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / setof, return next - чёто не могу разобраться / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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