MySQL로 구현한 게시판, ORACLE과 연동하여 쿼리 변경하기
지난 주 Eclipse와 MySQL을 연동해 게시판을 구현하였다. 유저 로그인, 회원가입, 게시판 글쓰기, 수정,삭제 기능이 있다.
이 게시판을 Oracle을 이용하여 연동하여 보자!
먼저 테이블 생성
CREATE TABLE USER_BBS(
userID VARCHAR(20) primary key,
userPassword VARCHAR(20),
userName VARCHAR(20),
userGender VARCHAR(20),
userEmail VARCHAR(50)
);
오라클에서 테이블 명으로 USER는 불가능하다. USER_BBS로 선언해서 만들어주자
정상적으로 데이터 삽입 삭제 수정이 되는지 확인하자
insert into user_bbs
values(‘jsw’,’jsw’,’jsw’,’MAN’,jsw4215@jsw4215.com’);
delete from bbs where userid=’jsw’;
이제 Eclipse로 들어가 userDAO를 수정하자
유저 로그인 및 회원가입이 되는지 확인하면 끝
여기서 쓰기만 잘 해내면 수정 삭제는 쉽다.
기존의 쿼리이다. Oracle은 맨 뒤의 ; (세미콜론)을 제거하고 prepared statement 를 사용해야한다.
SELECT * FROM bbs WHERE bbsID < ? AND bbsAvailable =1 ORDER BY bbsID DESC LIMIT 10;
여기서 Limit가 Oracle에는 없는 기능이기 때문에 다른 방식으로 10개를 뽑아내야 한다.
Limit가 없으면 어떻게 정렬시킨 10개의 데이터를 뽑아낼 수 있을까?
bbsID >10 and bbbsID <=20;
이런 형식의 쿼리는 Oracle에서는 먹히지 않는다.
Oracle은 0부터 데이터를 읽어야 한다.
우선 서브쿼리라고 해서 쿼리(서브쿼리) 이런식으로 쿼리를 2중으로 만들어 정렬된 쿼리에 순번을 매긴 후, 해당 순번에서 between A and B를 이용해 중간의 데이터를 10개 가져오는 쿼리를 만들어 보겠다.
한 단계씩 알아보자
조회된 순서대로 순번을 매긴다.
Select rownum , a.* from bbs a;
Order by를 이용해 정렬된 쿼리에 rownum을 이용해 순번을 매긴다.
Select rownum , x.* from(select a.* from bbs a order by a.bbsID) x;
Row_number() 함수를 이용해 order by로 정렬된 데이터에 rownum로 순번을 매긴다.
Select row_number() over(order by a.job, a.ename) row_num , a* from emp a order by a.job, a.ename;
++) Partition별로 순번을 부여할 수도 있다.
Select Row_number() over(partition by a.job order by a.job, a.ename) row_num , a.* from emp a order by a.job, a.ename;
이제 생각해보면
메인쿼리
Select * from (select row_number() over( order by bbsDate desc) NUM , a* from bbs a order by bbsDate) where NUM between 10 and 20;
Select * from () where NUM between 10 and 20; 쿼리에 서브쿼리로 bbsDATE순으로 정렬된 데이터가 있어야 한다.
서브쿼리
desc로 배열하는 이유는 새로 작성한 게시판 글일수록 bbsDate를 높을 숫자를 부여받기 때문이다.
select row_number() over( order by bbsDate desc) NUM , a* from bbs a;
이 부분에서 bbsDate를 desc로 정렬한 NUM(row_number)을 붙인 데이터들을 from bbs로부터 불러올 것인데, 우리는 조건을 하나 생각해야한다.
삭제시에 bbsAvailable 변수를 0으로 세팅할 것이다. 그러므로 from bbs a where bbsAvailable = 1;
조건을 붙여 다음과 같이 쿼리를 완성한다.
"select * from ( select row_number() over (order by bbsDate desc) NUM, A.* from bbs A where bbsavailable=1 order by bbsDate desc) where NUM between ? and ?";
마지막으로 하나 더, NUM이라는 변수가 추가로 출력되니 다음과 같이 preparedStatement를 출력시에 2 부터 출력하도록 한다.(1은 NUM이다.)
수정과 삭제는 그대로 이용하면 된다. 끝