금일부로 Oracle의 진도가 끝이나고, 다음주 월요일에 그동안 학습했던 내용들을 바탕으로 평가를 진행하게 된다. 월요일에 칠 평가문제들의 난이도는 아래와 같이 평이한 난이도로 출제가 된다고 하니, 복습을 하는 시간을 가져보도록 하겠다.
-- 1. 강의실 테이블 생성 CLASSROOM1
-- CODE CHAR1(1)PK, ROOM VARCHAR2(20)
CREATE TABLE clssroom1
(
code CHAR(1) NOT NULL,
room VARCHAR2(20),
CONSTRAINT PK_classroom1 PRIMARY KEY (code)
);
PK ( Personal Key ) 로는 강의실명 CODE를 지정했다.
-- 2. 테이블에 자료추가
-- CODE A,B,C,D ROOM 301호, 302호, 303호, 304호
INSERT INTO clssroom1 (CODE, ROOM)
VALUES('D', '3O4호');
COMMIT;
데이터를 추가할땐 COMMIT;
, ROLLBACK;
둘중 하나를 무조건 실행해줘야 한다! (감점요인)
-- 3. 학생 테이블 생성 STUDENT1
-- NO NUMBER PK
-- NAME VARCHAR2(20) NO NULL
-- CODE CHAR(1)
-- KOR, ENG, MATH NUMBER(3)
-- GRADE VARCHAR2(10) 1학년 ~ 4학년까지만 가능
CREATE TABLE STUDENT1
(
NO NUMBER,
NAME VARCHAR2(20) NOT NULL,
KOR NUMBER(3),
ENG NUMBER(3),
MATH NUMBER(3),
GRADE VARCHAR2(20),
CODE CHAR(1),
CONSTRAINT PK_STUDENT1 PRIMARY KEY (NO)
);
-- 4. 학생 테이블의 CODE는 강의실 CODE의 외래키 제약조건 (제약조건명 : fk_student1_code)
ALTER TABLE STUDENT1 ADD CONSTRAINT fk_student1_code
FOREIGN KEY (CODE) -- CLASSROOM1
REFERENCES clssroom1 (CODE); -- STUDENT1
-- 5. 시퀀스 생성 seq_student1_no (시작값101, 증가값1)
CREATE SEQUENCE seq_student1_no INCREMENT BY 1 START WITH 101;
-- 6. 시퀀스를 이용한 학생 5명 추가
INSERT INTO STUDENT1 (NO, NAME, KOR, ENG, MATH, GRADE, CODE)
VALUES(seq_student1_no.NEXTVAL,'강0', 60, 59, 82, '1학년', 'A');
COMMIT;
-- 7. 학생들의 정보 조회. 각 학생의 총합이 250~300 A, 200~249 B, 나머지는 C (학번, 이름, 국어, 영어, 수학, 총합)
SELECT
S.NO 학번, S.NAME 이름,
S.KOR 국어, S.ENG 영어, S.MATH 수학,
CASE
WHEN( (S.KOR + S.ENG + S.MATH) <=300 AND (S.KOR + S.ENG + S.MATH) >= 250 ) THEN 'A'
WHEN( (S.KOR + S.ENG + S.MATH) <=249 AND (S.KOR + S.ENG + S.MATH) >= 200 ) THEN 'B'
ELSE 'C'
END 총합
FROM STUDENT1 S;
데이터를 컬럼으로 나타내기 위해서는 IF가 아닌 CASE를 사용해야 한다!
SELECT
SUM(S.MATH), -- 수학점수 총합
S.GRADE -- N학년
FROM STUDENT1 S
GROUP BY S.GRADE ORDER BY S.GRADE ASC; -- 학년을 기준으로 분류
-- 9. 함수생성, 시퀀스번호를 반환하는 함수 생성하기 (func_nextval)
CREATE OR REPLACE FUNCTION func_nextval(STUDENT_CODE NUMBER) RETURN NUMBER IS
TMP_TOTAL NUMBER := 0;
BEGIN
SELECT S.NO INTO TMP_TOTAL FROM STUDENT1 S WHERE S.NO = STUDENT_CODE
GROUP BY S.NO;
RETURN TMP_TOTAL;
EXCEPTION WHEN OTHERS THEN
RETURN NULL;
END;
/
다음으로는 Mybatis를 활용하여 조건에 부합할 시, 데이터의 일부(컬럼 하나하나)를 수정하거나,
검색하고자 하는 내용의 항목을 표현 할 수 있도록 쿼리문을 구성해보았다.
먼저 데이터의 부분수정이다.
@Update({
" <script> ",
" UPDATE MEMBERTB SET MEM_NAME=#{obj.MEM_NAME} ",
" <if test = 'obj.MEM_PHONE != null'> ",
" , MEM_PHONE =#{obj.MEM_PHONE} ",
" </if> ",
" <if test = 'obj.MEM_ADDRESS != null'> ",
" , MEM_ADDRESS =#{obj.MEM_ADDRESS} ",
" </if> ",
" WHERE MEM_ID =#{obj.MEM_ID} ",
" </script> "
})
public int memberUpdateOne(@Param("obj") MemberTB obj);
기본적으로 정보수정의 기준이 되어 줄 'WHERE' 값과 'SET' 바로뒤에 붙어 줄 값이 두개가 필요하며, 위와같은 경우 나는memberTB의 ID값과 NAME값을 기준으로 잡았다. 그 외의 정보들은 입력된 값이 존재할 시 새로운 데이터가 업데이트 되도록 if문을 사용하여 쿼리문을 구성해주었다.
SELECT m.* FROM memberTB WHERE MEM_ID LIKE '%' || 'A' || '%' ;
SELECT m.* FROM memberTB WHERE MEM_NAME LIKE '%' || 'A' || '%' ;
SELECT m.* FROM memberTB WHERE MEM_PHONE LIKE '%' || 'A' || '%' ;
Oracle에서는 위와같이 SQL문을 구성하여 해당 값이 포함된 데이터를 조회할 수 있었다.
@Select({
" SELECT m.* FROM MEMBERTB m WHERE ${map.column} ", // value 값 이외에는 모두 괄호 앞에 $를 붙여주어야 함!!
" LIKE '%'|| #{map.txt} || '%' "
})
public List<MemberTB> MemberLikeList(@Param ("map") Map<String, Object> map);
java에 이어서 Oracle까지 벌써 진도가 끝이났다..
이제 다음주 4일동안 진행될 미니 프로젝트를 위해서 더욱더 증진해야한다.
처음 시도하는 프로젝트인만큼 어느때보다도 긴장되지만, 개발자로서의 커리어를 위한 위대한 발걸음을 한걸음 내딛는것 같아 감회가 새롭다.
이번 기회를 통해 내가 미처 발견하지 못한 내 부족했던 점들을 보완하여 앞으로의 새로운 학습에 있어서 좋은 밑거름이 되었으면 하는 바램이다.