Neřekl jsi, jestli máš v plánu upravit "X" a "Y" pokaždé, když uděláš stránkování. Pokud tak neučiníte, přístup je pravděpodobně platný pouze tehdy, pokud máte vysokou jistotu, že data jsou poměrně statická.
Zvažte následující příklad:
Moje tabulka T má 100 řádků data časového razítka pro „dnes“, s ID=1 až 100, a chci posledních 20 řádků pro svou první stránku. Takže udělám toto:
select *
from T
where date_col = trunc(sysdate)
order by id desc
fetch first 20 rows only
Spustím svůj dotaz a dostanu ID=100 až na 80. Zatím je to dobré – vše je na stránce uživatele a čtení dat trvá 30 sekund minut. Za tu dobu bylo do tabulky přidáno dalších 17 záznamů (ID=101 až 117).
Nyní uživatel stiskne "Další stránka"
Nyní znovu spustím dotaz, abych získal další sadu
select *
from T
where date_col = trunc(sysdate)
order by id desc
offset 20 fetch next 20 rows only
Neuvidí řádky 80 až 60, což by bylo jejich očekávání, protože se data změnila. Byli by
a) získat řádky ID=117 až 97 a přeskočit je kvůli OFFSETb) poté získat řádky ID=97 až 77, které se zobrazí na obrazovce
Budou zmateni, protože vidí téměř stejnou sadu řádků jako na první stránce.
Pro stránkování proti změně dat se obecně chcete držet dál od offsetové klauzule a používat svou aplikaci k tomu, abyste si všimli, kam jste se dostali, tj
Strana 1
select *
from T
where date_col = trunc(sysdate)
order by id desc
fetch first 20 rows only
Načítám ID=100 až na 80... vezmu na vědomí z 80. Můj další dotaz pak bude
select *
from T
where date_col = trunc(sysdate)
AND ID<80
order by id desc
fetch first 20 rows only
a můj další dotaz by byl
select *
from T
where date_col = trunc(sysdate)
AND ID<60
order by id desc
fetch first 20 rows only
a tak dále.