Roman Jaworski

Roman Jaworski Manager/Team
Leader/Web
Developer/Programist
a

Temat: Oracle - Limit Offset

Pracując z ORACLE 10G na potrzeby aplikacji webowych zauważyłem brak instrukcji LIMIT i OFFSET. Jak wygląda sytuacja w kolejnych wersjach? Jak uzasadnić brak takich prostych i często używanych instrukcji?
Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: Oracle - Limit Offset

Uzasadnić chyba się nie da ;-)
Tak samo jak brak nieupośledzonego interpretera poleceń z CLI.

LIMIT 10:


select * from
(
select costam from tabela order by twoj_order
) where rownum <= 10


coś a'la offset:


select * from
(
select costam from tabela order by twoj_order
) where rownum between 11 and 20
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: Oracle - Limit Offset

Irek Słonina:
coś a'la offset:


select * from
(
select costam from tabela order by twoj_order
) where rownum between 11 and 20

To raczej nie zadziała tak jak powinno. Przy takich ograniczeniach potrzebne jest trochę więcej gimnastyki i wprost z rownum się nie da skorzystać...
http://www.adp-gmbh.ch/ora/sql/rownum.html
Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: Oracle - Limit Offset

Łukasz Kurowski:
To raczej nie zadziała tak jak powinno. Przy takich ograniczeniach potrzebne jest trochę więcej gimnastyki i wprost z rownum się nie da skorzystać...
http://www.adp-gmbh.ch/ora/sql/rownum.html

?
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: Oracle - Limit Offset

Irek Słonina:
?

Czy mam wykonać wtórną robotę i przepisywać to co jest na stronie do której podałem link? Ok, lekkie streszczenie...
Jakiekolwiek ograniczenie od dołu bezpośrednio na pseudo-kolumnie rownum większe niż 1 powoduje, że zapytanie zwróci 0 rekordów. W związku z tym trzeba do select dodać rownum, opakować to w podzapytanie i dopiero na tym zakładać warunki.

Dopiero takie zapytanie zadziała jak trzeba...

select costam from
(
select costam, rownum r_ from
(
select costam from tabela order by twoj_order
)
)
where r_ between 11 and 20
Roman Jaworski

Roman Jaworski Manager/Team
Leader/Web
Developer/Programist
a

Temat: Oracle - Limit Offset

Działającym rozwiązaniem dla mnie jest:

select * from ( select a.*, ROWNUM rnum from 
( SELECT * FROM "BAZA"."TABELA") a where ROWNUM < 100)
where rnum >= 10


ale bardziej mnie interesuje czy da się to uprościć w kolejnych wersjach?

konto usunięte

Temat: Oracle - Limit Offset

Roman Jaworski:
ale bardziej mnie interesuje czy da się to uprościć w kolejnych wersjach?

Spoko, uproscimy :)
Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: Oracle - Limit Offset

Łukasz Kurowski:
Irek Słonina:
?

Czy mam wykonać wtórną robotę i przepisywać to co jest na stronie do której podałem link? Ok, lekkie streszczenie...

Dzięki, nie załapałem tego.
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: Oracle - Limit Offset

Roman Jaworski:
Działającym rozwiązaniem dla mnie jest:

Zapytanie jest ok, ale pod warunkiem, że dopuszczasz losowe wyniki (czyli jak się nawinie bazie). Równie dobrze mógłbyś od razu napisać warunek "ROWNUM <= 90".
Oracle najpierw wybierze pierwsze 99 rekordów które się nawinęły, a później z tych 99 nawiniętych odrzuci 9, które się nawinęły na początku. Domyślam się, że nie o to Ci chodzi, więc trzeba odpowiednio użyć ORDER BY.

P.S. Ogólnie ROWNUM nie jest miły w użyciu, więc trzeba bardzo uważać jak się go stosuje, żeby nie było na opak.
Chyba najlepszym rozwiązaniem jest wykorzystanie funkcji analitycznej ROW_NUMBER.
http://www.adp-gmbh.ch/ora/sql/analytical/row_number.html
Tutaj nie ma takich pułapek, ale i tak trzeba to opakować w podzapytanie.Łukasz Kurowski edytował(a) ten post dnia 20.01.11 o godzinie 17:32

konto usunięte

Temat: Oracle - Limit Offset

Jak się nie opakuje w podzapytanie to przekłamuje np. przy agregacji. Pozostaje liczyć na to, że Oracle wyciągnie wnioski z ostatnich zakupów.
Roman Jaworski

Roman Jaworski Manager/Team
Leader/Web
Developer/Programist
a

Temat: Oracle - Limit Offset

Ireneusz Ptak:

Spoko, uproscimy :)

Nie wydaje mi się. Wersja 10g pojawiła się na przełomie 2003/2004. Już kilka lat to upraszczacie.
Andrzej P.

Andrzej P. Oracle Database
Consultant

Temat: Oracle - Limit Offset

Tylko, że to już było oficjalnie opisane przez Oracle. A wersja 10g też nie jest wersją ostateczną.

Przykład stronicowania jest np. opisany w:
Oracle Database 2 Day + PHP Developer's Guide
Dział 4 Querying Data - Navigating Through Database Records.

konto usunięte

Temat: Oracle - Limit Offset

Roman Jaworski:
Pracując z ORACLE 10G na potrzeby aplikacji webowych zauważyłem brak instrukcji LIMIT i OFFSET. Jak wygląda sytuacja w kolejnych wersjach? Jak uzasadnić brak takich prostych i często używanych instrukcji?
Pewnie tak samo jak brak indeksów funkcyjnych w DB2?
Może takie coś ze względu na architekturę wewnętrzną nie jest takie proste i oczywiste?
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: Oracle - Limit Offset

Roman Jaworski:
Ireneusz Ptak:

Spoko, uproscimy :)

Nie wydaje mi się. Wersja 10g pojawiła się na przełomie 2003/2004. Już kilka lat to upraszczacie.


No sorry no.... Staramy się jak możemy...

konto usunięte

Temat: Oracle - Limit Offset

Trochę rozwiązań zostało już podanych. Oprócz tego polecam dyskusję na grupie Oracle. Oto link:

http://www.goldenline.pl/forum/599786/jak-wyswietlic-p...

konto usunięte

Temat: Oracle - Limit Offset

Co do uzasadnienia to pewnie takie jak zwykle : dodadzą jeszcze kilka nowych "ficzerów" które zasadniczo powinny być już od wersji 1.0.0.0.0 i nazwą to Oracle 12g :D Oczywiście masa firm zmigruje, zapłaci szmalec i biznes się kręci.

Następna dyskusja:

jdbc ORA-02395: exceeded ca...




Wyślij zaproszenie do