ORACLE에서 게시판 리스트를 만드려면 MySql과 다르게 ROW_NUMBER() 함수를 사용해야 합니다.


우선 쿼리를 먼저 보겠습니다.


select A.* from

(

   select
   COUNT(*) OVER() AS TOTAL_COUNT,
   AA.* from

   (

        SELECT
        ROW_NUMBER() OVER (ORDER BY bno DESC) RNUM,
        bno, title, content, writer, regdate, viewcnt
        from board               
     )AA
 )A
 where a.rnum between #{pageStart} and #{pageFinish} 


매우 복잡해보이죠?


하지만 하나씩 뜯어보면 그리 많이 복잡하지 않습니다.


select A.* from

(

   select
   COUNT(*) OVER() AS TOTAL_COUNT,
   AA.* from

   (

        SELECT
        ROW_NUMBER() OVER (ORDER BY bno DESC) RNUM,
        bno, title, content, writer, regdate, viewcnt
        from board               
     )AA
 )A
 where a.rnum between #{pageStart} and #{pageFinish}


색칠한 부분부터 분석해봅시다.


select A.* from

(

   select
   COUNT(*) OVER() AS TOTAL_COUNT,

1. A라는 임의의 테이블을 생성해줍니다.

2. A 테이블 안에서 COUNT(*) OVER() AS TOTAL_COUNT 를 작성해줍니다. (ORACLE 함수)

COUNT(*) OVER() AS TOTAL_COUNT는 테이블 안에 있는 총 데이터 수를 구하는 것입니다.



select A.* from

(

   select
   COUNT(*) OVER() AS TOTAL_COUNT,

   AA.* from

   (

        SELECT
        ROW_NUMBER() OVER (ORDER BY bno DESC) RNUM,
        bno, title, content, writer, regdate, viewcnt
        from board               
     )AA
 )A
 where a.rnum between #{pageStart} and #{pageFinish}



두번째 색칠한 부분을 분석해 봅시다.


AA.* from

   (

        SELECT
        ROW_NUMBER() OVER (ORDER BY bno DESC) RNUM,
        bno, title, content, writer, regdate, viewcnt
        from board

1. A라는 임의의 테이블 안에 AA라는 임의의 테이블을 생성합니다.

2. AA 테이블 안에 ROW_NUMBER() OVER (ORDER BY bno DESC) RNUM 을 작성해줍니다.

   bno를 내림차순으로 해서 정렬하겠다는 의미입니다.

3. 자신의 테이블 속에 컬럼을 작성해줍니다.


select A.* from

(

   select
   COUNT(*) OVER() AS TOTAL_COUNT,
   AA.* from

   (

        SELECT
        ROW_NUMBER() OVER (ORDER BY bno DESC) RNUM,
        bno, title, content, writer, regdate, viewcnt
        from board   
           
     )AA
 )A
 where a.rnum between #{pageStart} and #{pageFinish}


마지막 부분을 분석해 보겠습니다.


)AA
 )A
 where a.rnum between #{pageStart} and #{pageFinish}


1.AA 테이블과 A 테이블을 닫습니다.

2. 위에서 선언한 RNUM을 pageStart~pageFinish 만큼 출력합니다.



ORACLE로 게시판 리스트를 짜려고 할때 한가지 더 주의할 점이 있습니다.


바로 위의 query 맨 마지막에 작성한 #{pageStart} and #{pageFinish}  여기 부분인데요.

ORACLE에서 이 부분은 MySQL과 달라서 게시판 페이징을 계산할 때 신경을 좀 써줘야합니다.


MySQL의 경우는 0 AND 10 이라고 기입하면 1 페이지에서 10개의 리스트를 출력한다는 뜻이지만

ORACLE의 경우는 0 AND 10 이라고 기입 하면 0부터 10까지의 데이터를 출력한다는 뜻입니다.


첫 페이지의 경우 둘다 비슷한 결과가 나옵니다. ORACLE이 한개의 데이터가 더 출력되겠군요.
더욱 정확한 이해를 위해서 2페이지로 넘어가 보겠습니다.


MySQL의 경우는 10 AND 10 이라고 기입해야 2페이지에서 10개의 리스트를 출력한다는 의미가 됩니다.

만약 ORACLE에서 10 AND 10 이라고 기입하면 어떻게 될까요? 10번째에 있는 값 하나만 출력됩니다.


아직도 무슨 소린지 잘 모르시겠다구요? 표를 그려서 더욱 쉽게 확인해 보겠습니다.





차이점이 보이시나요?


MySQL의 경우 처음 값은 0, 10, 20 이렇게 10의 단위로 올라가고 두번째 값은 페이지에 출력될 값을 의미합니다.

반면에 ORACLE의 경우는 직접적인 숫자를 의미해서 출력될 값을 나타내줍니다. 좀 더 직관적이죠.

'ORACLE' 카테고리의 다른 글

ORACLE 컬럼 추가, 변경, 삭제  (0) 2016.09.23
ORACLE SEQUENCE 조회와 삭제  (0) 2016.09.23
ORACLE SEQUENCE 생성  (0) 2016.09.23
ORACLE 기본 문법  (0) 2016.09.23

+ Recent posts