The article by Steven Feuerstein (thanks Denis and Herald) says don't rely on %NOTFOUND when using bulk collect : When you are using BULK COLLECT and collections to fetch data from your > cursor, you should never rely on the cursor attributes to decide whether > to terminate your loop and data processing. It doesn't say why it works at the end of the loop though, but I'll leave it there. Just use %count on the collection instead. It reads better any way I reckon. Thanks for all the feedback, Cheers Tony