You're right that WHILE and FOR will produce the same result. However FOR loop is only 4 lines of code compare to 10 lines of code for WHILE. Which one is more readable and easier to maintain?
More important is that you do not print any bill twice suggest you change the between into where ( reccno() between (i) and (i + lnBatchSize -1) )