>데이터 베이스 >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이 할당되므로 내부 쿼리에서 먼저 데이터를 정렬해야 합니다. 그렇지 않으면 페이징 결과가 불확실해집니다.

쿼리 결과에 레코드가 하나만 있는 경우 위의 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 문을 사용하여 쿼리할 때는 주의하세요. 쿼리한 레코드 수가 한 페이지 미만인 경우 쿼리 결과가 비어 있게 됩니다. 이 경우 남은 레코드 수를 수동으로 계산하고 WHERE 절을 사용하여 필터링해야 합니다.

3. 요약

위에서는 Oracle 데이터베이스에서 페이징 기능을 구현하는 두 가지 방법, 즉 ROWNUM을 사용하는 방법과 OFFSET 및 FETCH를 사용하는 방법을 소개합니다. 두 방법 모두 장점과 단점이 있으며 개발자는 특정 애플리케이션 시나리오에 따라 적절한 방법을 선택할 수 있습니다.

쿼리 효율성을 높이기 위해서는 페이징 시 적절한 인덱스를 사용해야 한다는 점에 유의하세요. 동시에 쿼리 결과가 1,000개를 초과하는 경우 단일 쿼리에서 너무 많은 데이터가 반환되지 않도록 페이징 쿼리를 일괄 쿼리로 변환해야 합니다.

위 내용은 오라클에서 페이징을 작성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.