ページネーションを行うたびに「X」と「Y」を調整する予定があるかどうかはわかりませんでした。そうしない場合、アプローチはおそらく、データがかなり静的であるという高い確信がある場合にのみ有効です。
次の例を考えてみましょう:
私のテーブルTには、「今日」の日付タイムスタンプが100行あり、それぞれID =1から100であり、最初のページの最後の20行が必要です。だから私はこれをします:
select *
from T
where date_col = trunc(sysdate)
order by id desc
fetch first 20 rows only
クエリを実行して、ID =100を80まで取得します。これまでのところ、すべてがユーザーのページにあり、データの読み取りに30秒かかります。その間に、さらに17レコードがテーブルに追加されました(ID =101〜117)。
ここで、ユーザーは「次のページ」を押します
次にクエリを再度実行して、次のセットを取得します
select *
from T
where date_col = trunc(sysdate)
order by id desc
offset 20 fetch next 20 rows only
データが変更されているため、80行目から60行目までは表示されません。これは予想どおりです。彼らは
a)行ID =117から97までを取得し、OFFSETのためにそれらをスキップしますb)次に、行ID=97から77までを取得して画面に表示します
最初のページとほぼ同じ行のセットが表示されているため、混乱する可能性があります。
データの変更に対するページネーションについては、通常、offset句を避け、アプリケーションを使用して、どこに到達したかをメモします。つまり、
ページ1
select *
from T
where date_col = trunc(sysdate)
order by id desc
fetch first 20 rows only
ID=100を80までフェッチします...メモを取ります 次のクエリは
になります。select *
from T
where date_col = trunc(sysdate)
AND ID<80
order by id desc
fetch first 20 rows only
次のクエリは
select *
from T
where date_col = trunc(sysdate)
AND ID<60
order by id desc
fetch first 20 rows only
など。