事务应该是一个有意义的工作单元。但是什么构成工作单元取决于上下文。在 OLTP 系统中,一个工作单元将是一个人,以及他们的地址信息等。但听起来好像您正在实现某种形式的批处理,即加载大量的人。
如果您遇到 ORA-1555 问题,几乎可以肯定是因为您有一个长时间运行的查询,提供正在由其他事务更新的数据。在循环内提交有助于循环使用 UNDO 段,因此往往会增加您赖以提供读取一致性的段被重用的可能性。因此,不这样做可能是一个好主意。
是否使用 SAVEPOINTs 是解决方案是另一回事。我不确定在您的情况下会给您带来什么优势。当您使用 Oracle10g 时,也许您应该考虑使用批量DML 错误日志记录。
Alternatively you might wish to rewrite the driving query so that it works with smaller chunks of data. Without knowing more about the specifics of your process I can't give specific advice. But in general, instead of opening one cursor for 10000 records it might be better to open it twenty times for 500 rows a pop. The other thing to consider is whether the insertion process can be made more efficient, say by using bulk collection and FORALL.