오라클 Rownum을 이용한 페이징쿼리
- Posted at 2007/11/16 12:00
- Filed under 일함서/등등등..
오라클에서는 rownum을 이용하면 페이징 쿼리를 간결하게 만들수 있습니다.
아래방법들은 제가 찾았던 순서대로 적어봤습니다.
----------------------------------------------------------------------------------------------------------
[첫번째방법]
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
위 쿼리처럼 원하는 조건절 다음에 추가로 계산식 조건을 넣어준다음 사용하면 됩니다.
----------------------------------------------------------------------------------------
*주의할점
위 쿼리를 인덱스의 힌트와 함께 사용할 경우 다음과 같은 에러가 발생할수 있습니다.
Toad에서 실행하면 에러메시지와 함께 연결이 끊어져버리더군요..
ORA-03113: 통신 채널에 EOF 가 있습니다.
정확한 이유는 잘 모르겠네요. 원인을 아시는분께서는 속시원하게 설명좀 부탁드립니다^^;
출처 : 나무통발 (korekiss) 님의 네이버 블로그
Posted by web20korea
- Tag
- 오라클




,
오라클 페이징 쿼리



,
페이징




- Response
- No Trackback , 1 Comment

