'오라클'에 해당되는 글 1건
- 2008.08.14 오라클DB에서 페이지 나누기
DROP TABLE TempTextT;
CREATE TABLE TempTextT(
id NUMBER(3) NOT NULL,
title VARCHAR2(10) NULL );
INSERT INTO TempTextT VALUES(1,'hello');
INSERT INTO TempTextT VALUES(2,'java');
INSERT INTO TempTextT VALUES(4,'world');
INSERT INTO TempTextT VALUES(5,'temp');
INSERT INTO TempTextT VALUES(6,'like');
INSERT INTO TempTextT VALUES(9,'greet');
INSERT INTO TempTextT VALUES(10,'apple');
INSERT INTO TempTextT VALUES(11,'orange');
INSERT INTO TempTextT VALUES(12,'red');
INSERT INTO TempTextT VALUES(13,'purple');
INSERT INTO TempTextT VALUES(16,'temp');
INSERT INTO TempTextT VALUES(17,'football');
INSERT INTO TempTextT VALUES(19,'baseball');
INSERT INTO TempTextT VALUES(21,'microsoft');
INSERT INTO TempTextT VALUES(22,'sun');
INSERT INTO TempTextT VALUES(23,'dell');
INSERT INTO TempTextT VALUES(26,'twins');
INSERT INTO TempTextT VALUES(29,'lions');
위와 같은 TABLE을 가정하여 페이지 나누는것을 테스트한다.
-- id를 기준으로 페이지 나누는 것은 무리가 있다.
SELECT id, title FROM TempTextT
ORDER BY id DESC;
-- rownum이라는 시스템이 제공하는 필드가 일련번호를
제공하고 있다.
SELECT rownum, id FROM TempTextT;
-- id기준으로 정렬하니 rownum도 같이 흩어진다.
SELECT rownum, id FROM TempTextT
ORDER BY id DESC;
-- 서브쿼리를 이용하여 먼저 id로 정렬한 뒤에 그 결과에
rownum을 붙여주었다.
SELECT id, rownum FROM ( SELECT
id FROM TempTextT
ORDER BY id DESC );
-- 그 rownum을 하나의 필드로 만들어서 ( 서브쿼리 이용 )
5개의 단위로 이루어진 첫 페이지를 나누기
SELECT id FROM ( SELECT id, rownum AS sq
FROM ( SELECT id FROM TempTextT
ORDER BY id DESC ) )
ORDER BY sq DESC;
SELECT id FROM ( SELECT id, rownum AS sq
FROM ( SELECT id FROM TempTextT
ORDER BY id DESC ) )
WHERE sq > 0 AND sq <= 5;
-- 그 rownum을 하나의 필드로 만들어서 ( 서브쿼리 이용 )
5개의 단위로 이루어진 두번째 페이지를 나누기
SELECT id FROM ( SELECT id, rownum AS sq
FROM ( SELECT id FROM TempTextT
ORDER BY id DESC ) )
WHERE sq > 5 AND sq <= 10;
-- 최종적으로 첫번째 페이지에 해당하는 글 레코드를
SELECT 해 오는 문장은 아래와 같다.
SELECT * FROM TempTextT WHERE id IN
( SELECT id FROM ( SELECT id, rownum AS sq
FROM ( SELECT id FROM TempTextT
ORDER BY id DESC ) )
WHERE sq > 5 AND sq <= 10 )
ORDER BY id DESC;
---------------------------------------------------------
-- 현재 게시판에 등록된 글의 갯수는 아래와 같이
구할 수 있다.
SELECT COUNT(*) FROM TempTextT;
-- 게시판에 들어왔을때 별 다른 지정이 없으면 1페이지
에 해당하는 내용을 보여주고, 특정페이지를 지칭하면
그 페이지 번호를 알 수 있다.
-- 현재 보여주어야 할 페이지 수, 그리고 총 글의 갯수
두가지 정보를 알고 있으면 아래의 클래스를 이용하여
기타의 정보를 파악할 수 있다.
* PAGE_SIZE : 한 페이지에 보여줄 글의 갯수
* BLOCK_SIZE : 페이지 블록의 크기
* BlockStart : 페이지 블록의 시작 숫자
* BlockEnd : 페이지 블록의 끝 숫자
* PrePage : 이전페이지 유무
* NextPage : 이후페이지 유무
public class SplitPage
{
public static final int PAGE_SIZE = 10;
public static final int BLOCK_SIZE = 5;
public SplitPage(){ this( PAGE_SIZE , BLOCK_SIZE ); }
private int pageSize = PAGE_SIZE;
private int blockSize = BLOCK_SIZE;
public SplitPage( int pageSize , int blockSize )
{
this.pageSize = pageSize;
this.blockSize = blockSize;
}
public int getNumOfRec(){ return numOfRec; }
public int getNumOfPage(){ return numOfPage; }
public int getBlockStart(){ return blockStart; }
public int getBlockEnd(){ return blockEnd; }
private int numOfRec = 0;
private int numOfPage = 0;
private int blockStart = 0;
private int blockEnd = 0;
public boolean isPrePageExists(){ return prePage; }
public boolean isNextPageExists(){ return nextPage; }
private boolean prePage = false;
private boolean nextPage = false;
private int length = 0;
private int offset = 0;
public int getLength(){ return length; }
public int getOffset(){ return offset; }
private int page = 0;
public void setCurPage( int p ){ page = p; }
public void init( int numRec )
{
if( numRec > 0 )
{
numOfRec = numRec;
numOfPage = ( ( ( numRec - 1 ) / pageSize ) + 1 );
if( page > numOfPage )
{
throw new RuntimeException("WRONG PAGE NUMBER");
}
else
{
offset = ( page - 1 ) * pageSize;
length = Math.min( pageSize , numOfRec - ( page - 1 ) * pageSize );
blockStart = ( ( page - 1 ) / blockSize ) * blockSize + 1;
blockEnd = Math.min( blockStart + blockSize - 1 , numOfPage );
prePage = ( blockStart != 1 );
nextPage = ( blockEnd != numOfPage );
}
}
else
{
numOfRec = 0;
numOfPage = 0;
blockStart = 1;
blockEnd = 1;
prePage = false;
nextPage = false;
}
}
public static void main( String args[] )
{
SplitPage sp = new SplitPage();
sp.setCurPage( Integer.parseInt( args[1] ) );
sp.init( Integer.parseInt( args[0] ) );
System.out.println( "NumOfRec " + sp.getNumOfRec() );
System.out.println( "NumOfPage " + sp.getNumOfPage() );
System.out.println( "BlockStart " + sp.getBlockStart() );
System.out.println( "BlockEnd " + sp.getBlockEnd() );
System.out.println( "prePage " + sp.isPrePageExists() );
System.out.println( "nextPage " + sp.isNextPageExists() );
}
}
출처
cafe.naver.com/devtip |
'My work space > Java' 카테고리의 다른 글
HashTable & HashMap 설명 (0) | 2008.08.14 |
---|---|
상하위 클래스에서 생성자간의 관계 (0) | 2008.08.14 |
JVM의메모리구조 (0) | 2008.08.14 |
게시판 답글 방법 정리 (0) | 2008.08.14 |
게시판 답글 달기 정의 (0) | 2008.08.14 |