Как уже предлагали другие, вы можете использовать rownum в Oracle. Хотя это немного сложно, и вам нужно дважды вложить ваш запрос.
Например, чтобы разбить запрос на страницы
select first_name from some_table order by first_name
тебе нужно вложить это так
select first_name from
(select rownum as rn, first_name from
(select first_name from some_table order by first_name)
) where rn > 100 and rn <= 200
Причина этого в том, что rownum определяется после предложения where и до order by предложения. Чтобы понять, что я имею в виду, вы можете запросить
select rownum,first_name from some_table order by first_name
и вы можете получить
4 Diane
2 Norm
3 Sam
1 Woody
Это потому, что oracle оценивает предложение where (в данном случае ни одного), затем присваивает rownums, а затем сортирует результаты по first_name. Вы должны вложить запрос так, чтобы он использовал rownum, назначенный после строки были отсортированы.
Второе вложение связано с тем, как обрабатывается rownum в состоянии where. По сути, если вы запросите «где rownum> 100», то вы не получите результатов. Это просто курица и яйцо, где он не может вернуть ни одной строки, пока не найдет rownum> 100, но, поскольку он не возвращает никаких строк, он никогда не увеличивает rownum, поэтому он никогда не считается до 100. Тьфу. Второй уровень вложенности решает это. Обратите внимание, что в этот момент он должен иметь псевдоним столбца rownum.
Наконец, ваш заказ по предложению должен сделать запрос детерминированным. Например, если у вас есть Джон Доу и Джон Смит, и вы заказываете только по имени, то они могут переключаться между выполнением одного запроса на другое.
Здесь есть статьи http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html
и вот http://www.oracle.com/technology/oramag/oracle/07-jan/o17asktom.html. Теперь, когда я вижу, как долго мое сообщение, я, вероятно, должен был просто опубликовать эти ссылки ...