[답1]
CREATE OR REPLACE PROCEDURE proc_check(p_examno IN VARCHAR2 ,msg out varchar2)
IS
--답을 담을 변수
u1 NUMBER(1) := 0;
u2 NUMBER(1) := 0;
u3 NUMBER(1) := 0;
u4 NUMBER(1) := 0;
w1 NUMBER(3) := 0;
r1 NUMBER(3) := 0;
j_dap NUMBER(2) := 0;
d_no NUMBER(3) := 1; -- 문제 번호를 담는 목
CURSOR dap_cur IS
SELECT dap
FROM SW_DESIGN;
BEGIN
SELECT dap1, dap2, dap3, dap4 INTO u1, u2, u3, u4
FROM exam_paper;
-- OPEN ex_cur; -- 주석처리 된 부분
LOOP
FETCH dap_cur INTO j_dap;
EXIT WHEN dap_cur%NOTFOUND;
IF d_no = 1 THEN
IF j_dap = u1 THEN
r1 := r1 + 1;
ELSE
w1 := w1 + 1;
END IF;
END IF;
IF d_no = 2 THEN
IF j_dap = u2 THEN
r1 := r1 + 1;
ELSE
w1 := w1 + 1;
END IF;
END IF;
IF d_no = 3 THEN
IF j_dap = u3 THEN
r1 := r1 + 1;
ELSE
w1 := w1 + 1;
END IF;
END IF;
IF d_no = 4 THEN
IF j_dap = u4 THEN
r1 := r1 + 1;
ELSE
w1 := w1 + 1;
END IF;
END IF;
-- d_no를 증가시킴
d_no := d_no + 1;
END LOOP;
CLOSE dap_cur;
--여기서 update문 작성해야함
msg := '정답 : ' ||r1||'오답:'||w1;
update exam_paper2
set RIGHT_ANSWER = r1,
WRONG_ANSWER = w1
where exam_no = p_examno;
commit;
END;
/
[답2]
CREATE OR REPLACE procedure SCOTT.proc_account2
is
vexam_no varchar2(10);
--수험생이 입력한 1번 답안
u1 number(1):=0;
--수험생이 입력한 2번 답안
u2 number(1):=0;
--수험생이 입력한 3번 답안
u3 number(1):=0;
--수험생이 입력한 4번 답안
u4 number(1):=0;
--1번 정답
d1 number(1):=0;
--2번 정답
d2 number(1):=0;
--3번 정답
d3 number(1):=0;
--4번 정답
d4 number(1):=0;
--수험생이 맞춘 정답 수를 담음
r1 number(3):=0;
--수험생이 틀린 수를 담음
w1 number(3):=0;
cursor paper_cur is
select exam_no, dap1, dap2, dap3, dap4 from exam_paper;
begin
SELECT
min(decode(d_no,1,dap))
, min(decode(d_no,2,dap))
, min(decode(d_no,3,dap))
, min(decode(d_no,4,dap))
INTO d1, d2, d3, d4
FROM sw_design
GROUP BY ceil(d_no/4);
open paper_cur;
--3명 수험생 채점 진행
loop
fetch paper_cur into vexam_no, u1,u2,u3,u4;
--무한루프에 대한 방어 코드 작성하기
exit when paper_cur%notfound;--학생수만큼 반복된다 - 3바퀴를 돈다
if u1 = d1 then
r1:=r1+1;
else
w1:=w1+1;
end if;
if u2 = d2 then
r1:=r1+1;
else
w1:=w1+1;
end if;
if u3 = d3 then
r1:=r1+1;
else
w1:=w1+1;
end if;
if u4 = d4 then
r1:=r1+1;
else
w1:=w1+1;
end if;
update exam_paper
set right_answer = r1,
wrong_answer = w1
where exam_no = vexam_no;
commit;
r1:=0;
w1:=0;
end loop;
close paper_cur;
end;
/
-- fetch into에 변수가 있어야 하는 이유는 테이블을 보면 수험번호에 11,27,37 이런식으로 끝자리가 형성되어 있는데
-- 업데이트시 해당 부분이 필요하다.(커서를 통해서 받아들여야한다)
-- select exam_no ,dap1,dap2,dap3,dap4 from exam_paper (답을 추출하는 과정)
-- 비교 시 u1 = d1을 비교해야함
-- loop if u1 = d1 then r1:=r1+1 else w1:=w1+1 end if 이다.
-- 업데이트 위치는 end loop문 한 줄 안 쪽에 있어야한다. r1이 누적되어야한다. 그렇기 때문에 1~3번까지의 정답을