오라클 - 프로시저

지환·2023년 11월 29일
0

오라클

목록 보기
9/10
post-thumbnail

[답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번까지의 정답을 
profile
아는만큼보인다.

0개의 댓글