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.

Author: stephenbayer, 2008-10-28

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)
 118
Author: Brian Schmitt,
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;
 115
Author: Chobicus,
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.

 44
Author: JoelC,
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
 8
Author: Vadim Kirilchuk,
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]

 5
Author: Furetto,
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