Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как избежать ненужным кэшированием имен временных таблиц в функции на pltcl
|
|||
|---|---|---|---|
|
#18+
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 в принципе не кэшируются ? И как бороться ? Или я в чем-то туплю ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2005, 20:05 |
|
||
|
Как избежать ненужным кэшированием имен временных таблиц в функции на pltcl
|
|||
|---|---|---|---|
|
#18+
кстати сказать. Пробовал описывать обе функции как immutable, stable - результат один :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2005, 20:40 |
|
||
|
Как избежать ненужным кэшированием имен временных таблиц в функции на pltcl
|
|||
|---|---|---|---|
|
#18+
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. Или PREPARE - EXECUTE? Или бог (он же: хрен) его знает что ещё? А с правами все нормально? В общем я не профи, может кто ещё подключится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2005, 08:57 |
|
||
|
Как избежать ненужным кэшированием имен временных таблиц в функции на pltcl
|
|||
|---|---|---|---|
|
#18+
Гм. Я сегодня более внимательно посмотрел, на каком запросе ругается. Проблема оказалась не в удалении таблицы - я криво смотрел. Ошибка возникает на запросе select ... from balancean в вызывающей функции ClosePeriod. После первого вызова CalcBalance() все проходит нормально. А потом уже возникает ошибка. Т.о. проблема должна решиться тем, что вместо прямого select ... from balancean я должен написать execute ... Счас проверю :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2005, 11:45 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=33110535&tid=2007185]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 272ms |
| total: | 433ms |

| 0 / 0 |
