Транзакция должна быть значимой единицей работы. Но то, что составляет Единицу Работы, зависит от контекста. В системе OLTP единица работы - это один человек, вместе с информацией об адресе и т. Д. Но звучит так, как будто вы реализуете какую-то форму пакетной обработки, которая загружает много людей.
Если у вас есть проблемы с ORA-1555, это почти наверняка, потому что у вас есть длительный запрос, предоставляющий данные, которые обновляются другими транзакциями. Фиксация внутри вашего цикла способствует циклическому использованию сегментов UNDO и, следовательно, будет увеличивать вероятность того, что сегменты, на которые вы полагаетесь для обеспечения согласованности чтения, будут повторно использованы. Так что не делать это, вероятно, хорошая идея.
Вопрос о том, является ли использование SAVEPOINTs решением, является другим вопросом. Я не уверен, какое преимущество это даст вам в вашей ситуации. Поскольку вы работаете с Oracle10g, возможно, вам следует рассмотреть вместо этого массовое протоколирование ошибок DML .
В качестве альтернативы вы можете переписать управляющий запрос, чтобы он работал с небольшими порциями данных. Не зная больше о специфике вашего процесса, я не могу дать конкретный совет. Но в целом вместо открытия одного курсора для 10000 записей может быть лучше открыть его двадцать раз для 500 строк в секунду. Другая вещь, которую стоит рассмотреть, - можно ли сделать процесс вставки более эффективным, скажем, с помощью массового сбора и FORALL.