Множество статей для запросов разбивки на страницы Oracle, но я обычно использую:
select * from (
select a.*, rownum r
from (
select *
from your_table
where ...
order by ...
) a
where rownum <= :upperBound
)
where r >= :lowerBound;
Требуется упорядочение по, но я обычно использую индексированные столбцы, а использование rownum означает, что Oracle может использовать оптимизацию с помощью клавиши остановки. Таким образом, не обязательно делать полное сканирование таблицы.
Итак, если у вас есть 100 строк на странице, и вы хотите страницу 3, ваш lowerBound = 301 и upperBound = 400.
Использование NTILE, как советует AndriyM, является хорошим ответом, если вы абсолютно не можете указать размер страницы, но я полагаю, что вы увидите определенные потери производительности на больших таблицах (я полагаю, что нет оптимизации с помощью клавиш остановки). Именно поэтому я опубликовал это, чтобы вы могли сравнить производительность и посмотреть, имеет ли смысл динамический размер страницы для вашего приложения.