Off the top of my head, could it be that the result in cursor is overwritten at the next execute call?
Your SELECT call fills the results. The first call to the results generator works fine because there are still results from the SELECT. You then use the same cursor to execute an UPDATE, which "resets" the cursor results. Hence, the next call to the generator kills the loop. If you remove the UPDATE, the cursor results aren't reset, allowing the loop to continue.
This is just a guess. I haven't tried it out.