LOOP'ом и фиксировать в цикле каждый INSERT. Т.е. чтобы каждый INSERT коммитился, даже пока не закончилась внешняя транзакция с LOOP' ом?
Никак. Какой в этом вообще смысл?
Надо вставить много записей в таблицу. При этом не хочется держать транзакцию пока там 1,5 ляма инсертов делается. Так же не хочется на середине процесса в случае ошибки потерять полляма вставленных записей
> При этом не хочется держать транзакцию пока там 1,5 ляма инсертов делается. А надо, если это на самом деле транзакция. Т.е. буквально то, о чём Вы спрашивали, невозможно просто потому, что противоречит определению транзакции. И почему не хочется-то, кстати? > Так же не хочется на середине процесса в случае ошибки потерять полляма вставленных записей Тогда можно разделить этот процесс на отдельные транзакции, или же в самом деле использовать SAVEPOINTs (от критических ошибок они не помогут, конечно).
Ну на самокате тоже, теоретически, можно доехать до Луны
Нет. 1,5 ляма не нужно вставлять одной транзакцией. Нет такой необходимости. Но если я бегу по записям с помощью курсора внутри функции, то я обременен тем, что это всё делается в транзакции. Как мне сделать, чтобы это были маленькие кусочки. Условно вставки по 1000 штук? Мне не нужно обеспечивать транзакционную вставку 1,5 ляма записей
Предположу банальность бежать курсором по 1000 записей или не бегать курсором вообще
Собирайте в приложении батчи по несколько тысяч записей
Insert into as select from where id >0 and <1000
> Но если я бегу по записям с помощью курсора внутри функции, то я обременен тем, что это всё делается в транзакции. Да, это неизбежно — управление транзакциями именно в функциях невозможно. Зато возможно в процедурах (если они сами вызываются не в явной транзакции). Может быть, это подойдёт (в таком случае это будут отдельные транзакции, конечно)? Кроме того, курсор можно выполнить однажды (WITH HOLD), и в последующих отдельных транзакциях "дочитывать" из него по 1000 штук.
Спасибо за ваш ответ!!!
Масса вариантов, на самом деле. Ваш комментарий "savepoint -- не решает" -- говорит о том, что Вы, во-первых не сильны в объяснениях, а во-вторых решаете какую-то задачу. Притом не ту, которая написана. Начните формулировать ту, которую решаете, если хотите чтобы она была решэна.
Обсуждают сегодня