Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / return table execute qwerystr ? / 15 сообщений из 15, страница 1 из 1
23.04.2015, 14:30
    #38943602
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return table execute qwerystr ?
помогите реализовать
функция должна вернуть таблицу
есть в теле некий гигатский qwerystr тип текст, туда склеивается будущий запрос типа "select ... from "
как сделать RETURN что бы он сперва execute запрос qwerystr, и положил в результат как таблицу

есть это:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE OR REPLACE FUNCTION export.seltab(id_t bigint, pin_date timestamp without time zone, ... )
  RETURNS TABLE(az_id bigint, ...) AS
$BODY$
declare
    str_query text;
    ....
begin
str_query='select ...';
if тото when
str_query=str_query || 'select ...';
end if;


    return ???????????

end;

$BODY$
  LANGUAGE plpgsql 
...
Рейтинг: 0 / 0
23.04.2015, 14:51
    #38943626
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return table execute qwerystr ?
Ну по поводу выполнить запрос... смотреть Dynamic SQL
...
Рейтинг: 0 / 0
23.04.2015, 14:57
    #38943638
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return table execute qwerystr ?
Владимир СА,

надо не просто выполнить запрос, а перенести данные в ретурн фунции

что бы потом можно было например select * fom export.seltab(...)t where ... order by ... и тп, в общем работать как с таблицей
...
Рейтинг: 0 / 0
23.04.2015, 15:09
    #38943663
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return table execute qwerystr ?
Владимир САНу по поводу выполнить запрос... смотреть Dynamic SQL

А при чем тут ECPG к pl/pgsql вопросу собственно?

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
23.04.2015, 15:11
    #38943666
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return table execute qwerystr ?
LegushkaВладимир СА,

надо не просто выполнить запрос, а перенести данные в ретурн фунции

что бы потом можно было например select * fom export.seltab(...)t where ... order by ... и тп, в общем работать как с таблицей

http://www.postgresql.org/docs/9.4/static/plpgsql-control-structures.html
в части 40.6.1.2. RETURN NEXT and RETURN QUERY
а особенно в части
RETURN QUERY EXECUTE command-string [ USING expression [, ... ] ];

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
25.04.2015, 10:29
    #38945144
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return table execute qwerystr ?
Maxim Boguk, и всем всем всем большое спасибо-)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
05.10.2016, 13:10
    #39320971
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return table execute qwerystr ?
Maxim, можно ли еще в функции возвращающей таблицу перечислить поля таблицы так, что бы взять список полей и типов на основе указанной таблицы?

или только явно описать все колонки?
...
Рейтинг: 0 / 0
05.10.2016, 13:23
    #39320990
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return table execute qwerystr ?
Legushka,

Если вернуть надо все поля одной таблицы, но и ничего более (например, если хранимка делает какую-нибудь хитрую фильтрацию) - то можно сказать returns setof tablename.
Учесть только, что alter table этой таблицы потребует пересоздание хранимки.
...
Рейтинг: 0 / 0
05.10.2016, 13:59
    #39321033
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return table execute qwerystr ?
MelkijLegushka,

Если вернуть надо все поля одной таблицы, но и ничего более (например, если хранимка делает какую-нибудь хитрую фильтрацию) - то можно сказать returns setof tablename.
Учесть только, что alter table этой таблицы потребует пересоздание хранимки.

Не потребует.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
05.10.2016, 14:59
    #39321092
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return table execute qwerystr ?
Maxim BogukНе потребует.
СУПЕР! как в свое время это очень надо было и не знал про этот способ-),
а на вьюхи можно так же?
...
Рейтинг: 0 / 0
05.10.2016, 15:33
    #39321133
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return table execute qwerystr ?
LegushkaMaxim BogukНе потребует.
СУПЕР! как в свое время это очень надо было и не знал про этот способ-),
а на вьюхи можно так же?

Можно кажется.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
05.10.2016, 15:51
    #39321154
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return table execute qwerystr ?
Maxim Boguk, хм, интересно. Действительно не могу воспроизвести, returns setof нормально реагирует на изменения таблицы.
А вот с returns tablename воспроизвёл:
Код: sql
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 table testtable (
	id serial primary key,
	val varchar(255) not null
);

insert into testtable (val) values ('foo'),('bar');

create or replace function returntesttable()
returns testtable as $$
declare 
	t testtable;
begin
	select * into t from testtable limit 1;
    return t;
end
$$ language plpgsql;

select * from returntesttable();

-- alter table testtable alter column val type varchar(300);
alter table testtable add column ts timestamp default null;

select * from returntesttable();
-- error: returned record type does not match expected record type


Наверное, я как раз на эти грабли наступил, но замятовал, что не setof там был. Давно было, больше года назад.
...
Рейтинг: 0 / 0
05.10.2016, 15:57
    #39321159
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return table execute qwerystr ?
MelkijMaxim Boguk, хм, интересно. Действительно не могу воспроизвести, returns setof нормально реагирует на изменения таблицы.
А вот с returns tablename воспроизвёл:
Код: sql
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 table testtable (
	id serial primary key,
	val varchar(255) not null
);

insert into testtable (val) values ('foo'),('bar');

create or replace function returntesttable()
returns testtable as $$
declare 
	t testtable;
begin
	select * into t from testtable limit 1;
    return t;
end
$$ language plpgsql;

select * from returntesttable();

-- alter table testtable alter column val type varchar(300);
alter table testtable add column ts timestamp default null;

select * from returntesttable();
-- error: returned record type does not match expected record type


Наверное, я как раз на эти грабли наступил, но замятовал, что не setof там был. Давно было, больше года назад.

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

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
05.10.2016, 16:10
    #39321168
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return table execute qwerystr ?
Maxim Boguk, спасибо, учту.
...
Рейтинг: 0 / 0
05.10.2016, 16:35
    #39321192
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return table execute qwerystr ?
Maxim Bogukпересоединитесь с базой и все заработает.
у вас просто старая версия хранимки закеширована в процессе.
Пересоздавать функцию не надо надо просто старые коннекты прибить чтобы перечитался код.

--
Maxim Boguk
www.postgresql-consulting.ru

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

тут можно просто перегрузить ф--ю , дабы она "перечиталась кодом"

Код: sql
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.
BEGIN;
create table testtable (
	id serial primary key,
	val varchar(255) not null
);

insert into testtable (val) values ('foo'),('bar');

create or replace function returntesttable()
returns testtable as $$
declare 
	t testtable;
begin
	select * into t from testtable limit 1;
    return t;
end
$$ language plpgsql;

select * from returntesttable();

-- alter table testtable alter column val type varchar(300);
alter table testtable add column ts timestamp default null;

-- invalidate  manually //перезагрузка
	create or replace function returntesttable()
	returns testtable as $$
	declare 
		t testtable;
	begin
		select * into t from testtable limit 1;
	    return t;
	end
	$$ language plpgsql;
-- invalidate manually
select * from returntesttable();
rollback;



то же, для сетофа:

Код: sql
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.
BEGIN;
create table testtable (
	id serial primary key,
	val varchar(255) not null
);

insert into testtable (val) values ('foo'),('bar');

create or replace function returntesttable()
returns setof testtable as $$
declare 
	t testtable;
begin
	select * into t from testtable limit 1;
    return next t;
end
$$ language plpgsql;

select * from returntesttable();

-- alter table testtable alter column val type varchar(300);
alter table testtable add column ts timestamp default null;

--/*
-- invalidate  manually //перезагрузка
	create or replace function returntesttable()
	returns setof testtable as $$
	declare 
		t testtable;
	begin
		select * into t from testtable limit 1;
	    return next t;
	end
	$$ language plpgsql;

-- invalidate manually
--*/
select * from returntesttable();
-- ERROR:  wrong record type supplied in RETURN NEXT
-- CONTEXT:  PL/pgSQL function returntesttable() line 6 at RETURN NEXT

rollback;





всё совсем плохо для иммутабностей -- кеш значений валяется судя по всему в шареде. при перезагрузке в любом сеансе он инвалидизируется, и все конкуренты имеют шансы вылететь на разрущении кеша. (оно не полезет пересчитывать, а скажет "не шмогла") причем , кажется, сие даже не зависит от коммита на перегружающей (давно было, надо перепровериться).

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


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