powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / return table execute qwerystr ?
15 сообщений из 15, страница 1 из 1
return table execute qwerystr ?
    #38943602
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
помогите реализовать
функция должна вернуть таблицу
есть в теле некий гигатский 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
return table execute qwerystr ?
    #38943626
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну по поводу выполнить запрос... смотреть Dynamic SQL
...
Рейтинг: 0 / 0
return table execute qwerystr ?
    #38943638
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир СА,

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

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

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

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
return table execute qwerystr ?
    #38943666
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
return table execute qwerystr ?
    #38945144
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk, и всем всем всем большое спасибо-)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
return table execute qwerystr ?
    #39320971
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim, можно ли еще в функции возвращающей таблицу перечислить поля таблицы так, что бы взять список полей и типов на основе указанной таблицы?

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

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

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

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

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

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

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
return table execute qwerystr ?
    #39321154
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
return table execute qwerystr ?
    #39321159
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
return table execute qwerystr ?
    #39321168
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk, спасибо, учту.
...
Рейтинг: 0 / 0
return table execute qwerystr ?
    #39321192
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
15 сообщений из 15, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / return table execute qwerystr ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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