반응형
- 게시판 테이블
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)
반응형
댓글