'오라클'에 해당되는 글 1건

  1. 2008.08.14 오라클DB에서 페이지 나누기
2008. 8. 14. 15:49

오라클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