Oracle は、ページング用の OFFSET ステートメントや FETCH ステートメントなどの豊富な SQL 言語機能を提供する、非常に人気のあるリレーショナル データベース管理システムです。実際の開発では、クエリ効率を最適化し、ユーザー エクスペリエンスを向上させるために、ページングを使用する必要があることがよくあります。この記事ではOracleにページング機能を実装する方法を紹介します。
1. ページングに ROWNUM を使用する
Oracle には、数値を順番に割り当て、ページング操作に使用できる組み込みの ROWNUM 疑似列があります。クエリを通じて結果セット全体を取得し、ROWNUM を使用して指定されたページ番号とレコード番号を持つデータをフィルターで除外できます。
たとえば、EMPLOYEE という名前のテーブルがあり、ページ 2 をクエリして各ページに 10 件のレコードを表示する必要があるとします。次の SQL ステートメントを使用してページングを実装できます。
SELECT * FROM ( SELECT ROWNUM rn, e.* FROM EMPLOYEE e WHERE ROWNUM <= :page * :pageSize ) WHERE rn > (:page - 1) * :pageSize
このうち、:page と :pageSize はパラメータで、クエリ対象のページ番号と各ページに表示されるレコードの数を示します。この SQL ステートメントの具体的なプロセスは次のとおりです。
ROWNUM は並べ替え後に割り当てられるため、内部クエリは最初にデータを並べ替える必要があります。そうしないと、ページングの結果が不確かになります。
クエリ結果にレコードが 1 つしかない場合、上記の SQL ステートメントを使用すると結果セットが空になる可能性があることに注意してください。解決策は、WHERE rn > (:page - 1):pageSize を WHERE rn BETWEEN ((:page - 1):pageSize 1) AND (:page * :pageSize) に変更することです。
2. OFFSET および FETCH ページングの使用
Oracle 12c 以降では、OFFSET および FETCH ステートメントを使用したページングがサポートされています。この方法では ROWNUM を使用する必要がなく、構文がより簡潔かつ明確になります。以下は、OFFSET と FETCH を使用してページングを実装する例です。
SELECT * FROM EMPLOYEE ORDER BY emp_id OFFSET (:page - 1) * :pageSize ROWS FETCH NEXT :pageSize ROWS ONLY
このうち、:page と :pageSize はそれぞれ、クエリ対象のページ番号と各ページに表示されるレコードの数を表します。この SQL ステートメントの具体的なプロセスは次のとおりです。
OFFSET ステートメントと FETCH ステートメントを使用してクエリを実行する場合は注意してください。クエリされたレコード数が 1 ページ未満の場合、クエリ結果は空になります。この場合、残りのレコードの数を手動で計算し、WHERE 句を使用してフィルタリングする必要があります。
3. 概要
上記では、Oracle データベースにページング機能を実装する 2 つの方法 (ROWNUM を使用する方法と、OFFSET と FETCH を使用する方法) を紹介しています。どちらの方法にも独自の長所と短所があり、開発者は特定のアプリケーション シナリオに応じて適切な方法を選択できます。
クエリ効率を向上させるために、ページング時に適切なインデックスを使用する必要があることに注意してください。同時に、クエリ結果が 1,000 を超える場合は、1 つのクエリで返されるデータが多すぎることを避けるために、ページング クエリをバッチ クエリに変換する必要があります。
以上がOracleでページングを記述する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。