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

Вопрос: как изолировать каждый вызов одной и той же функции? На стороне MS RS либо в свойствах самой функции?
Спасибо! Уверен вопрос банальный, я только начал осваивать psg.
...
Рейтинг: 0 / 0
Изоляция двух вызовов одной функции в одной(?) транзакции
    #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
Изоляция двух вызовов одной функции в одной(?) транзакции
    #39584425
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bosyak,

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

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

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

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

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

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

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

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

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

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


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