ホームページ >データベース >Oracle >Oracleでページングを記述する方法

Oracleでページングを記述する方法

PHPz
PHPzオリジナル
2023-04-04 13:59:374830ブラウズ

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 ステートメントの具体的なプロセスは次のとおりです。

  1. 内部クエリでは、最初に EMPLOYEE テーブル内のレコードが ROWNUM サイズに従って並べ替えられ、各レコードに ROWNUM 番号が割り当てられます。
  2. 外部クエリは、WHERE rn > (:page - 1) * :pageSize を使用して内部クエリの結果セットを操作し、指定されたページ番号とレコード番号を持つデータをフィルターで除外します。

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 ステートメントの具体的なプロセスは次のとおりです。

  1. まず、emp_id に従って EMPLOYEE テーブル内のレコードを並べ替えます。
  2. OFFSET (:page - 1) * :pageSize ROWS は、スキップする行数、つまり、ソートされたテーブル内でクエリされる開始レコードの位置を指定します。
  3. FETCH NEXT :pageSize ROWS ONLY は、クエリされるレコードの数、つまり各ページに表示されるレコードの数を指定します。

OFFSET ステートメントと FETCH ステートメントを使用してクエリを実行する場合は注意してください。クエリされたレコード数が 1 ページ未満の場合、クエリ結果は空になります。この場合、残りのレコードの数を手動で計算し、WHERE 句を使用してフィルタリングする必要があります。

3. 概要

上記では、Oracle データベースにページング機能を実装する 2 つの方法 (ROWNUM を使用する方法と、OFFSET と FETCH を使用する方法) を紹介しています。どちらの方法にも独自の長所と短所があり、開発者は特定のアプリケーション シナリオに応じて適切な方法を選択できます。

クエリ効率を向上させるために、ページング時に適切なインデックスを使用する必要があることに注意してください。同時に、クエリ結果が 1,000 を超える場合は、1 つのクエリで返されるデータが多すぎることを避けるために、ページング クエリをバッチ クエリに変換する必要があります。

以上がOracleでページングを記述する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。