I believe that if you build cache on your own you can always do better because you have more control.
However, instead of building everything yourself, may be you can try to use some functionality of marketed products, for example, I heard Oracle9 App Server has good cache.

if returning to your sample, then one thing is not good:
to fetch 101 row you need to refetch 100 rows. If even Oracle minimize the load by using internal cache, the 100 fetches stil are there.
So it is better to use cursor cache: open cursor and KEEP IT OPENED, untill you need to reuse the cursor. (In Oracle terms, its is "cursors shared pool"). Then, you must keep cursor ID in your page. When you request 101 row from a cursor that is aged out from pool, you can reopen the cursor and rewind it to 101 record. However, if user request 101 row from a cursor that is not aged out, then you just use this cursor.