티스토리 뷰

IT/DB

Oracle - Paging 처리

Normal_One 2017. 3. 5. 17:03

  회사가 자체적인 솔루션이나 Framework 안에 Paging 처리를 포함하고 있다면 볼 필요가 없는 사항이지만, SI 업계 특성상 자신의 회사의 Framework를 적용하지 못하는 일도 빈번하고 있다고 하더라도 찾아서 적용시키는 일은 시간이 걸립니다. 따라서, 간단하게 Oracle을 통해서 Paging처리를 하는 것에 대해 정리하고자 합니다. 시작은 ROWNUM을 통한 가장 간단하고 기초적인 Paging처리 부터 시작해서 ROW_NUMBER() OVER()를 통한 순서 정리와 COUNT(*) OVER()를 통한 Paging Navigation 대처까지 해보도록 하겠습니다.


1. ROWNUM을 통한 Paging

  먼저 ROWNUM을 통한 가장 간단한 Paging을 진행하도록 하겠습니다. 기본적인 형태는 아래와 같습니다.

1
SELECT * FROM (SELECT A.*, ROWNUM AS rnum FROM EMPLOYEES A) WHERE rnum BETWEEN 6 AND 10;
cs

 가지고 오고 싶은 컬럼들을 작성한 후 ROWNUM이란 컬럼을 추가하면 됩니다. 그러면 자동적으로 각각의 행값들에 ROWNUM이란 컬럼이 추가되며 자동적으로 번호가 붙게 됩니다. 그 후 이 쿼리를 서브쿼리로 사용하여 ROWNUM에 조건을 넣어 가지고 오고 싶어하는 범위내의 값들만 가져옵니다.   BETWEEN 옆의 값들은 Java에서 가져온 변수들을 통해 적절하게 바꿔주시면 됩니다.


2. ROW_NUMBER() OVER()를 통한 Paging
 
 위의 방식은 가장 기초적인 방식으로 자신이 원하는 순서대로 번호를 붙여서 정렬시킨 후 가져올 수 없다는 단점이 있습니다. ORDER BY 문을 붙이더라도 마찬가지입니다. 이럴 때는 ROW_NUMBER() OVER()를 통해서 정렬시킨 후 번호를 붙여주어야 합니다.

1
SELECT * FROM (SELECT A.*, ROW_NUMBER() OVER(ORDER BY HIRE_DATE) AS rnum FROM EMPLOYEES A) WHERE rnum BETWEEN 6 AND 10;
cs

 고용 날짜를 통해서 정렬시킨 후 번호를 붙여준 형태입니다. OVER()안에 정렬시키고 싶은 기준 조건을 ORDER BY를 통해 써주면 자동적으로 정렬 된 형태에서 번호를 매겨줍니다.

3. COUNT(*) OVER()를 통한 Paging Navigation 대비

 위의 방식까지를 통해서 정렬한 후 원하는 값들을 뽑아오는 것까지 해보왔습니다. 다만, 저런 방식으로만 가져오면 불러온 값들의 총 갯수를 알 수 없다는 단점이 있습니다. 불러온 값들의 총 갯수를 알지 못하면 Paging Navigation을 만들수가 없습니다. 따라서, 여기에 총 갯수를 가져오는 컬럼을 추가해줍니다.

1
SELECT * FROM (SELECT A.*, ROW_NUMBER() OVER(ORDER BY HIRE_DATE) AS rnum, COUNT(*) OVER() AS cnum FROM EMPLOYEES A) WHERE rnum BETWEEN 6 AND 10;
cs

 COUNT(*) OVER()를 넣어서 총 갯수를 가져오도록 했습니다. 이를 Java단에서 적절히 계산하면 Paging Navigation까지 대처가 가능합니다.

 위의 방식들은 가장 간단한 게시판 등의 Paging 처리로 좀 더 머리를 굴려보면 더 좋은 방식으로 발전시킬 수 있을겁니다.

 

'IT > DB' 카테고리의 다른 글

Oracle - 다른 계정 table Truncate 시키기  (0) 2019.09.13
Oracle - ROWNUM 활용법  (0) 2017.07.30
Oracle - Index 및 쿼리 성능 평가  (0) 2017.03.05
Oracle - DECODE문  (0) 2017.03.05
Oracle - Case When문  (0) 2017.03.05
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday