본문 바로가기
학습/Oracle

- 페이징 처리 쿼리

by Elfen Lied 2022. 12. 23.
반응형

- 게시판 테이블

DROP TABLE BOARD_PAGING;

CREATE TABLE BOARD_PAGING (
    BNO NUMBER(10),
    TITLE VARCHAR2(500) NOT NULL,
    CONTENT VARCHAR2(4000) NOT NULL,
    WRITER VARCHAR2(100) NOT NULL,
    WRITEDATE DATE DEFAULT SYSDATE,
    CONSTRAINT PK_BOARD PRIMARY KEY(BNO)
);

DROP SEQUENCE BNO_SEQ;
CREATE SEQUENCE BNO_SEQ;

COMMIT;

SELECT * FROM BOARD_PAGING;

 

- 게시판에 데이터 넣게

DECLARE
    I INT;
BEGIN
    FOR I IN 1 .. 412
    LOOP
        INSERT INTO BOARD_PAGING(BNO, TITLE, CONTENT, WRITER)
        VALUES(BNO_SEQ.NEXTVAL, '제목임.'||I, '내용임.'||I, '관리자');
    END LOOP;

END;

 

 

 

- 내림차순정렬 : ORDER BY

-- 내림차순정렬 : ORDER BY
SELECT * FROM BOARD_PAGING ORDER BY BNO DESC;

 

 

- 내림차순정렬 : 오라클 힌트

-- 내림차순정렬 : 오라클 힌트
SELECT /*+INDEX_DESC(BOARD_PAGING PK_BOARD)*/ * FROM BOARD_PAGING;

SELECT 다음 주석처럼 /* [여기] */ 적는다

+INDEX_DESC(게시판이름 PK_BOARD)     게시판이름과 공백 그리고 테이블에서 지정한 PK_BOARD 를 넣는다.

 

 

- 기본 페이징

-- 서브쿼리
SELECT * FROM BOARD_PAGING WHERE BNO <= 30;

-- 1번부터 10번까지 : 1 페이지
SELECT * FROM (SELECT * FROM BOARD_PAGING WHERE BNO <= 10) WHERE BNO > 0;

-- 21번부터 30번까지 : 3 페이지
SELECT * FROM (SELECT * FROM BOARD_PAGING WHERE BNO <= 30) WHERE BNO > 20;
-- 21번부터 30번까지 : 3 페이지
SELECT * FROM (SELECT /*+INDEX_DESC(BOARD_PAGING PK_BOARD)*/ * FROM BOARD_PAGING WHERE BNO <= 30) WHERE BNO > 20;

위 방식의 문제점은 시퀀스를 사용하고 있어서, 만약 8번 글을 지우면 1~10번까지 데이터를 가져오는데 9개만 가져온다
하지만 10개의 데이터 페이징을 얻고 싶기때문에 다른 방식을 써야한다.

 

 

- ROWNUM 사용

-- ROWNUM
SELECT /*+INDEX_DESC(BOARD_PAGING PK_BOARD)*/ ROWNUM, BNO, TITLE, CONTENT, WRITER, WRITEDATE FROM BOARD_PAGING;

-- 2 페이지 : 11번 ~ 20번
SELECT /*+INDEX_DESC(BOARD_PAGING PK_BOARD)*/ ROWNUM, BNO, TITLE, CONTENT, WRITER, WRITEDATE FROM BOARD_PAGING WHERE ROWNUM <= 20;

SELECT
    ROWNUM, BNO, TITLE, CONTENT, WRITER, WRITEDATE 
FROM 
    (SELECT /*+INDEX_DESC(BOARD_PAGING PK_BOARD)*/
        ROWNUM AS RN, BNO, TITLE, CONTENT, WRITER, WRITEDATE 
    FROM BOARD_PAGING WHERE ROWNUM <= 20)
WHERE RN > 10;

 

- 페이징 정리

/*
    게시글 10개씩 페이징 처리 (페이징게시물수 = 10 : amount)
    1페이지 : 0 - 10
    2페이지 : 10 - 20
    3페이지 : 20 - 30
        ...
    41페이지 : 401 - 410    
    42페이지 : 411 - 412
    
    pageNum : minRow(포함안됨) - maxRow(포함)
    minRow = (pageNum-1) * amount
    maxRow = pageNum * amount    
*/

 

- 자바에서 dao 로직 쿼리에 ? 부분으로 작성

SELECT
    ROWNUM, BNO, TITLE, CONTENT, WRITER, WRITEDATE 
FROM 
    (SELECT /*+INDEX_DESC(BOARD_PAGING PK_BOARD)*/
        ROWNUM AS RN, BNO, TITLE, CONTENT, WRITER, WRITEDATE 
    FROM BOARD_PAGING WHERE ROWNUM <= ?)
WHERE RN > ?;

setInt(1, maxRow)
setInt(2, minRow)

 

반응형

'학습 > Oracle' 카테고리의 다른 글

- 유저 생성  (0) 2022.12.07

댓글