Actually, large transactions based on looping on a cursor are a source of ORA-01555.
I've troubleshooted and fixed a zillion loop-cursor based queries throwing ORA-01555, the usual mistake is to commit inside the loop which tell Oracle UNDO space can be reused while actually your query needs to have the UNDO space available until the end of the loop.
