Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как избежать ненужным кэшированием имен временных таблиц в функции на pltcl / 5 сообщений из 5, страница 1 из 1
09.06.2005, 20:05
    #33110535
strizh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избежать ненужным кэшированием имен временных таблиц в функции на pltcl
PostgreSQL 7.4.6
Есть длинная функция CalcBalance, написанная на pltcl, и описанная как volatile. В ней идет расчет балансной таблицы по 1 валюте, результатом ее является временная таблица. Внутри динамически создаются и удаляются другие временные таблицы.

Создание временной таблицы примерно так:

set stQuery "CREATE local temp table balancean ......
spi_exec $stQuery

Удаление временной таблицы (с проверкой на существование) примерно так:

set stQuery {select tablename from pg_tables where tablename = ''balancean'' and tableowner = getpgusername()}
spi_exec $stQuery
if {[info exists tablename]} then {
spi_exec "drop table balancean cascade"
}

Функция используется в нескольких местах системы - все успешно работает у полутора десятков людей. При ее многократном вызове из одной сессии у одного юзера все нормально - временные таблицы успешно создаются и удаляются.
Последнее место, куда ее надо прикрутить - это функция расчета итогов квартала по всем валютам, и переноса возникших долгов на новый квартал. Для чего пишу функцию ClosePeriod на plpgsql, описываю ее как volatile. В ней в цикле по валютам пробую вызывать эту самую CalcBalance с разными параметрами, и обрабатывать балансы на предмет долгов.
По первой валюте CalcBalance отрабатывает, а по второй возникает ошибка:

relation with OID 779961 does not exist

Ошибка возникает на вышеприведенной строчке удаления временной таблицы BalanceAN. Т.е. грабли в том, что при таком циклическом вызове функции из другой функции "умный" Postgres обламывается по-новой разбирать запрос

drop table balancean cascade

а пользуется созданным ранее планом выполнения ?

Но ведь мало того, что обе ф-ции - CalcBalance, ClosePeriod - описаны как volatile, так еще и функции на pltcl в принципе не кэшируются ?
И как бороться ?
Или я в чем-то туплю ?
...
Рейтинг: 0 / 0
09.06.2005, 20:40
    #33110562
strizh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избежать ненужным кэшированием имен временных таблиц в функции на pltcl
кстати сказать. Пробовал описывать обе функции как immutable, stable - результат один :-(
...
Рейтинг: 0 / 0
10.06.2005, 08:57
    #33110885
Funny_Falcon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избежать ненужным кэшированием имен временных таблиц в функции на pltcl
PostgreSQL 8.0.2
Код: 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.
create or replace function "Tries".tcl_temp_table() returns void as $$
set stQuery "CREATE local temp table balancean (id serial);"
spi_exec $stQuery
set stQuery {select id from  balancean}
spi_exec $stQuery
set stQuery {select tablename from pg_tables where tablename = 'balancean' and tableowner = getpgusername()}
spi_exec $stQuery
if {[info exists tablename]} then {
spi_exec "drop table balancean cascade"
}
$$
language pltcl;

create or replace function "Tries".round_tcl_temp_table() returns void as $$
declare
	i int;
begin
	for i in  1 .. 10  loop
		perform "Tries".tcl_temp_table();
	end loop;
	return;
end;
$$
language plpgsql;

begin;
select "Tries".tcl_temp_table(); 
select "Tries".tcl_temp_table(); 
commit;
select "Tries".round_tcl_temp_table();
Все работает. Может баг пофиксен. А может где VIEW "не нужный"?
Или PREPARE - EXECUTE? Или бог (он же: хрен) его знает что ещё?
А с правами все нормально? В общем я не профи, может кто ещё подключится.
...
Рейтинг: 0 / 0
10.06.2005, 11:45
    #33111412
strizh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избежать ненужным кэшированием имен временных таблиц в функции на pltcl
Гм. Я сегодня более внимательно посмотрел, на каком запросе ругается. Проблема оказалась не в удалении таблицы - я криво смотрел. Ошибка возникает на запросе select ... from balancean в вызывающей функции ClosePeriod. После первого вызова CalcBalance() все проходит нормально. А потом уже возникает ошибка.
Т.о. проблема должна решиться тем, что вместо прямого select ... from balancean я должен написать execute ...
Счас проверю :(
...
Рейтинг: 0 / 0
10.06.2005, 12:30
    #33111596
strizh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избежать ненужным кэшированием имен временных таблиц в функции на pltcl
Точно. Это я тупой был. Помогло в ClosePeriod
stQuery := ''select ... from временная таблица ...'';
execute stQuery;
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как избежать ненужным кэшированием имен временных таблиц в функции на pltcl / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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