Przywoływanie z Oracle
Nie jestem tak obeznany z wyrocznią, jak bym chciał. Mam jakieś 250 tysięcy rekordów i chcę je wyświetlać po 100 na stronę. Obecnie mam jedną procedurę składowaną, która pobiera wszystkie ćwierć miliona rekordów do zbioru danych za pomocą adaptera danych, dataset i dataadapter.Metoda Fill (dataset) na wynikach z zapisanego proc. Jeśli mam "numer strony" i "liczba rekordów na stronę" jako wartości całkowite mogę przekazać jako parametry, co byłoby najlepszym sposobem, aby wrócić tylko, że konkretna sekcja. Powiedzmy, że jeśli zdam 10 jako numer strony, a 120 jako liczbę stron, z Oświadczenia select da mi 1880-ty do 1200-ty, lub coś w tym stylu, moja matematyka w mojej głowie może być wyłączona.
Robie to w. Net z C#, myslalem, ze to nie wazne, jesli uda mi sie to zrobic od strony sql, to powinno byc spoko.
Aktualizacja: udało mi się skorzystać z sugestii Briana i działa świetnie. Chciałbym popracować nad jakąś optymalizacją, ale strony nadchodzą w ciągu 4 do 5 sekund, a nie minuty, a moja kontrola przywoławcza była w stanie zintegrować się bardzo dobrze z moim nowym przechowywanym proc.
5 answers
Coś takiego powinno działać: z bloga Fransa Bouma
SELECT * FROM
(
SELECT a.*, rownum r__
FROM
(
SELECT * FROM ORDERS WHERE CustomerID LIKE 'A%'
ORDER BY OrderDate DESC, ShippingDate DESC
) a
WHERE rownum < ((pageNumber * pageSize) + 1 )
)
WHERE r__ >= (((pageNumber-1) * pageSize) + 1)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-27 22:46:30
Zapytaj Toma o paginację i bardzo, bardzo przydatne funkcje analityczne.
To jest fragment tej strony:
select * from (
select /*+ first_rows(25) */
object_id,object_name,
row_number() over
(order by object_id) rn
from all_objects)
where rn between :n and :m
order by rn;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-04 09:02:43
W trosce o kompletność, dla osób poszukujących bardziej nowoczesnego rozwiązania, w Oracle 12c pojawiły się nowe funkcje, w tym lepsze stronicowanie i najlepsza obsługa.
Paging
Stronicowanie wygląda tak:
SELECT *
FROM user
ORDER BY first_name
OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY;
Top N Records
Zdobywanie najlepszych płyt wygląda tak:
SELECT *
FROM user
ORDER BY first_name
FETCH FIRST 5 ROWS ONLY
Zwróć uwagę, jak oba powyższe przykłady zapytań mają ORDER BY
klauzule. Nowe polecenia respektują je i są uruchamiane na posortowanych danych.
I nie udało się znaleźć dobrej strony referencyjnej Oracle dla FETCH
lub OFFSET
, ale ta strona ma świetny przegląd tych nowych funkcji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-28 19:04:42
Chcę tylko podsumować odpowiedzi i komentarze. Istnieje wiele sposobów wykonywania paginacji.
Przed oracle 12c nie było funkcji OFFSET/FETCH, więc spójrz na whitepaper, jak sugerował @jasonk. Jest to najbardziej kompletny artykuł, jaki znalazłem na temat różnych metod ze szczegółowym wyjaśnieniem zalet i wad. Kopiowanie i wklejanie ich tutaj zajęłoby sporo czasu, więc nie zrobię tego.
Jest też dobry artykuł od jooq twórcy wyjaśniający niektóre typowe zastrzeżenia dotyczące paginacji oracle i innych baz danych. jooq ' s blogpost
Dobra wiadomość, od oracle 12c mamy nową funkcjonalność OFFSET/FETCH. OracleMagazine 12C nowe funkcje . Proszę odnieść się do "Top-N Queries and Pagination"
Możesz sprawdzić swoją wersję oracle, wydając następujące oświadczenie
SELECT * FROM V$VERSION
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-21 21:25:32
Spróbuj:
SELECT *
FROM
(SELECT FIELDA,
FIELDB,
FIELDC,
ROW_NUMBER() OVER (ORDER BY FIELDC) R
FROM TABLE_NAME
WHERE FIELDA = 10
)
WHERE R >= 10
AND R <= 15;
Via [tecnicume]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-16 17:52:07