|
Изоляция двух вызовов одной функции в одной(?) транзакции
|
|||
---|---|---|---|
#18+
День добрый! Проблема такая: клиент (отчет на MS Reporting Services) вызывает хранимую функцию (postgresql 9.6). В хранимой функции помимо прочего создается временная таблица. Но эта функция в двух разных DataSet одного отчета вызывается 2 раза. Происходит все это, я так понимаю, в одной транзакции. В итоге отчет при формировании выдает ошибку на этапе создания временной таблицы (она уже существует). Вопрос: как изолировать каждый вызов одной и той же функции? На стороне MS RS либо в свойствах самой функции? Спасибо! Уверен вопрос банальный, я только начал осваивать psg. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2018, 23:26 |
|
Изоляция двух вызовов одной функции в одной(?) транзакции
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2018, 12:40 |
|
Изоляция двух вызовов одной функции в одной(?) транзакции
|
|||
---|---|---|---|
#18+
Bosyak, temporary table создаются на соединение (если не было указано on commit drop) Если временная табличка нужна лишь в пределах одной функции - лучше всего выпилить нафиг эту временную табличку. Идея похуже, но тоже можно для аналитики - сделать drop temporary table в конце хранимки. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2018, 14:20 |
|
Изоляция двух вызовов одной функции в одной(?) транзакции
|
|||
---|---|---|---|
#18+
256k, знаю про такой способ. Но при параллельном вызове функции абсолютно нормально, что в один момент времени в разных вызовах функции внутри нее создаются таблицы с одинаковым именем. Более того они могут быть по разному заполнены. Поэтому ни DROP TABLE IF EXISTS temp_table1, ни on commit drop мне не помогут. Мне необходимо как-то отделить друг от друга 2 вызова одной функции в одной сессии. Либо есть другой способ, о котором я не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2018, 18:31 |
|
Изоляция двух вызовов одной функции в одной(?) транзакции
|
|||
---|---|---|---|
#18+
Bosyak256k, знаю про такой способ. Но при параллельном вызове функции абсолютно нормально, что в один момент времени в разных вызовах функции внутри нее создаются таблицы с одинаковым именем. Более того они могут быть по разному заполнены. Поэтому ни DROP TABLE IF EXISTS temp_table1, ни on commit drop мне не помогут. Мне необходимо как-то отделить друг от друга 2 вызова одной функции в одной сессии. Либо есть другой способ, о котором я не знаю. Если временная таблица используется только в этой функции - создавайте ее с уникальным именем да и х.с.н. Тогда и смеси в данных не будет при одновременном вызове и др. побочных эффектов. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2018, 19:36 |
|
Изоляция двух вызовов одной функции в одной(?) транзакции
|
|||
---|---|---|---|
#18+
Bosyak256k, знаю про такой способ. Но при параллельном вызове функции абсолютно нормально, что в один момент времени в разных вызовах функции внутри нее создаются таблицы с одинаковым именем. Более того они могут быть по разному заполнены. Поэтому ни DROP TABLE IF EXISTS temp_table1, ни on commit drop мне не помогут. Мне необходимо как-то отделить друг от друга 2 вызова одной функции в одной сессии. Либо есть другой способ, о котором я не знаю.сдаётся, дон что-то спутал. видимо на жабе пишет. никакой такой параллельности вызова ф-й в одной сессии в пж нет (кроме б.м. агрегатов). а сетоф-ф-ии не фетчат по мере расчета, а отдают всё разом. чтобы смешать наборы , надо спец кухню заводить -- в одной хранимке например считать набор. а в других -- вычитывать отдельные значения. если всё считаете и отдаёте в одной ф-ии, пока (9.6) можно уверенно считать что дроп в конце ф-ии всё порешает. (но не "он коммит", ессно) а вообще времянки пока зло. считайте в массив типа, если данных не слишком много. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2018, 20:08 |
|
|
start [/forum/topic.php?fid=53&msg=39584653&tid=1996002]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 288ms |
total: | 423ms |
0 / 0 |