티스토리 뷰

웹개발/DataBase

오라클 페이징 처리 하기

야쿠 yaku 2011. 7. 17. 00:03


 
 
[첫번째방법]
 
 
 
select * from (
    select rownum as rnum, A.* from (
      [사용할 SQL 쿼리는 이부분에 작성세요]
    ) A where rownum <= (:PageNo + 1) * :PageSize order by rownum desc
  ) where rownum <= :PageSize order by rnum asc;

 
 
 
*주의할점
 
위 쿼리를 사용할경우 마지막페이지의 실제 레코드수가 PageSize 크기보다 작은경우에도
 
마지막 레코드부터 PageSize 만큼 가져오게 됩니다.
 
예를 들면 PageSize는 20 이고 마지막페이지의 레코드수가 5개일때도

위 쿼리는 마지막 레코드부터 20개를 가져옵니다.

그러면 마지막페이지와 이전페이지에 15개의 레코드가 중복되어서 보이게 되겠죠..
 
때문에 선택한 페이지가 마지막페이지라면 마지막페이지에 해당하는 레코드가 아닌 레코드는
 
아래와 같은 처리를 이용해서 삭제한 다음 바인딩하시면 됩니다.
 
 
 
다음 예제는 ASP.NET WITH C#를 사용했습니다.
 
 
 
// 위 페이징쿼리를 통해 가져온 레코드가 DataSet인 dsResult의 0번째 테이블에 들어있다고 가정합니다.
 
int deleteRowNum = PageSize * (PageNum-1);
DataRow[] rows = dsResult.Tables[0].Select("RNUM<="+deleteRowNum.ToString());
 
foreach(DataRow row in rows)
    row.Delete();
 
 
 
----------------------------------------------------------------------------------------------------------
 
 
 
[두번째방법]
 
 
 
사용할 쿼리의 가져오는 컬럼에 ROWNUM을 추가하여 범위를 지정해서 가져온다.
 
 
 
select * from (
 
         select rownum as rnum, name, address from members
    ) where rnum between (:PageNo * (:PageNo-1)) and ((:PageNo * (:PageNo-1)) + :PageSize )
 
 
 
----------------------------------------------------------------------------------------------------------
 
 
 
[세번째방법]
 
 
 
각 레코드가 포함된 페이지의 번호를 계산해서 그 번호와 페이지번호와 일치하는 레코드만 가져오는 방법입니다.
 
 
 
select * from members where age>20 and CEIL(rownum/:PageSize) = :PageNo

 
위 쿼리처럼 원하는 조건절 다음에 추가로 계산식 조건을 넣어준다음 사용하면 됩니다.
 
 

'웹개발 > DataBase' 카테고리의 다른 글

mySql 명령어 간략 정리  (0) 2011.07.17
INDEX 제대로 사용하기  (0) 2011.07.17
오라클 페이징 처리 하기  (0) 2011.07.17
Oralce 기본 사용 명령어  (0) 2011.07.16
Mysql 자료  (0) 2011.06.07
MySql UTF-8 설정  (2) 2011.01.30
댓글
댓글쓰기 폼