Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Изоляция двух вызовов одной функции в одной(?) транзакции / 6 сообщений из 6, страница 1 из 1
14.01.2018, 23:26
    #39584066
Bosyak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изоляция двух вызовов одной функции в одной(?) транзакции
День добрый! Проблема такая:
клиент (отчет на MS Reporting Services) вызывает хранимую функцию (postgresql 9.6). В хранимой функции помимо прочего создается временная таблица. Но эта функция в двух разных DataSet одного отчета вызывается 2 раза. Происходит все это, я так понимаю, в одной транзакции. В итоге отчет при формировании выдает ошибку на этапе создания временной таблицы (она уже существует).

Вопрос: как изолировать каждый вызов одной и той же функции? На стороне MS RS либо в свойствах самой функции?
Спасибо! Уверен вопрос банальный, я только начал осваивать psg.
...
Рейтинг: 0 / 0
15.01.2018, 12:40
    #39584322
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изоляция двух вызовов одной функции в одной(?) транзакции
BosyakДень добрый! Проблема такая:
клиент (отчет на MS Reporting Services) вызывает хранимую функцию (postgresql 9.6). В хранимой функции помимо прочего создается временная таблица. Но эта функция в двух разных DataSet одного отчета вызывается 2 раза. Происходит все это, я так понимаю, в одной транзакции. В итоге отчет при формировании выдает ошибку на этапе создания временной таблицы (она уже существует).

Вопрос: как изолировать каждый вызов одной и той же функции? На стороне MS RS либо в свойствах самой функции?
Спасибо! Уверен вопрос банальный, я только начал осваивать psg.

Временную таблицу можно создавать, если она не существует, чтобы избежать ошибки.
Или удалять
https://stackoverflow.com/questions/22929365/create-a-temp-table-if-not-exists-for-use-into-a-custom-procedure
...
Рейтинг: 0 / 0
15.01.2018, 14:20
    #39584425
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изоляция двух вызовов одной функции в одной(?) транзакции
Bosyak,

temporary table создаются на соединение (если не было указано on commit drop)
Если временная табличка нужна лишь в пределах одной функции - лучше всего выпилить нафиг эту временную табличку. Идея похуже, но тоже можно для аналитики - сделать drop temporary table в конце хранимки.
...
Рейтинг: 0 / 0
15.01.2018, 18:31
    #39584653
Bosyak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изоляция двух вызовов одной функции в одной(?) транзакции
256k, знаю про такой способ. Но при параллельном вызове функции абсолютно нормально, что в один момент времени в разных вызовах функции внутри нее создаются таблицы с одинаковым именем. Более того они могут быть по разному заполнены.

Поэтому ни
DROP TABLE IF EXISTS temp_table1, ни on commit drop мне не помогут.

Мне необходимо как-то отделить друг от друга 2 вызова одной функции в одной сессии.
Либо есть другой способ, о котором я не знаю.
...
Рейтинг: 0 / 0
15.01.2018, 19:36
    #39584683
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изоляция двух вызовов одной функции в одной(?) транзакции
Bosyak256k, знаю про такой способ. Но при параллельном вызове функции абсолютно нормально, что в один момент времени в разных вызовах функции внутри нее создаются таблицы с одинаковым именем. Более того они могут быть по разному заполнены.

Поэтому ни
DROP TABLE IF EXISTS temp_table1, ни on commit drop мне не помогут.

Мне необходимо как-то отделить друг от друга 2 вызова одной функции в одной сессии.
Либо есть другой способ, о котором я не знаю.

Если временная таблица используется только в этой функции - создавайте ее с уникальным именем да и х.с.н.
Тогда и смеси в данных не будет при одновременном вызове и др. побочных эффектов.
...
Рейтинг: 0 / 0
15.01.2018, 20:08
    #39584693
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изоляция двух вызовов одной функции в одной(?) транзакции
Bosyak256k, знаю про такой способ. Но при параллельном вызове функции абсолютно нормально, что в один момент времени в разных вызовах функции внутри нее создаются таблицы с одинаковым именем. Более того они могут быть по разному заполнены.

Поэтому ни
DROP TABLE IF EXISTS temp_table1, ни on commit drop мне не помогут.

Мне необходимо как-то отделить друг от друга 2 вызова одной функции в одной сессии.
Либо есть другой способ, о котором я не знаю.сдаётся, дон что-то спутал.
видимо на жабе пишет.

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

а вообще времянки пока зло. считайте в массив типа, если данных не слишком много.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Изоляция двух вызовов одной функции в одной(?) транзакции / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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