Страницы

Поиск по вопросам

четверг, 28 ноября 2019 г.

Прототип limit в oracle

#oracle


Можно ли как-нибудь организовать возможность вывода части запроса с n по m позиции
также как это реализовано в mysql добавлением к запросу limit n,m?
Есть решение, обернуть в несколько запросов, но не подходящее из-за нагрузки на субд
такими запросами при "среднебольших" таблиц:
select * from (select rownum as rn,* from ... where ...) d where d.rn between n and m

Да и скан показывает, что вложенный запрос весь ложится в память. Можно ли как-то
в первый запрос (вложенный) подставить n и m?    


Ответы

Ответ 1



Привет, ребята из 2011, я сейчас в 2015 году и мы делаем так: SELECT * FROM my_table OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY;

Ответ 2



DECLARE CURSOR c_merge IS SELECT * FROM DUAL; type c_merge_row_type is table of c_merge%rowtype; rec_merge c_merge_row_type; BEGIN open c_merge; loop -- здесь устанавливаете размер "порции" для считывания fetch c_merge bulk collect into rec_merge limit 50; for i in 1..rec_merge.count loop // do something end loop; exit when c_merge%notfound; end loop; close c_merge; END; Добавлено из комментария. Этот код - это 2 вложенных цикла, 1-ый возвращает вам записи: 0-50 51-100 101-150, итд Второй уже обрабатывает каждую запись отдельно. Если вы хотите обработать только с 100 по 150 добавьте счетчик: counter:=0, записи 0-50 counter:=1, записи 51-100 counter:=2, записи 101-150 UP: вариант с bulk collect не очень удобен если вам нужно обработать последнюю "порцию" данных, эту проблему легко решить добавив/изменив ORDER BY условие в исходный запрос

Ответ 3



Вот почитайте здесь: возврат части отсортированной выборки. Выдать записи с 10-й по 19-ю из выборки по представлению ALL_TABLES, отсортированной по полю TABLE_NAME: select o.* from (select rownum rw , o.* from (select o.* from all_tables o order by table_name) o where rownum < 20 ) o where o.rw >= 10; Возрат части отсортированной выборки через аналитическую функцию ROW_NUMBER(): select o.* from (select o.* , row_number() over (order by o.table_name) rw from all_tables o ) o where o.rw >= 10 and o.rw < 20;

Комментариев нет:

Отправить комментарий