프로시저를 생성한다.
CREATE OR REPLACE PROCEDURE P_TBLEMPSAL_INS
IS
--읽어와야할 대상을 커서로 지정
CURSOR CUR_TBLEMPSAL
IS
SELECT *
FROM TBLEMPSAL;
V_TBLEMPSALRCD TBLEMPSAL%ROWTYPE;
V_GRADE TBLEMPSALRANK.GRADE%TYPE;
--2를 해결하기 위한 커서 생성
CURSOR CUR_TBLEMPSALRANK
IS
SELECT EMPNO, SAL
FROM TBLEMPSALRANK;
-- 2번째 커서에서 생성한 변V_EMPNO, V_SAL;수에 대한 정의
V_EMPNO TBLEMPSALRANK.EMPNO%TYPE;
V_SAL TBLEMPSALRANK.SAL%TYPE;
--석차에 관한 커서
CURSOR CUR_TBLEMPSALRANK2
IS
SELECT SAL
FROM TBLEMPSALRANK;
V_SAL_OTHER TBLEMPSALRANK.SAL%TYPE;
V_SEOKCHA TBLEMPSALRANK.SEOKCHA%TYPE := 1;
BEGIN
OPEN CUR_TBLEMPSAL;
LOOP
FETCH CUR_TBLEMPSAL INTO V_TBLEMPSALRCD;
--읽어온 것을 V_TBLEMPSALRCD 라는 변수로 담아 두겠다.
EXIT WHEN CUR_TBLEMPSAL%NOTFOUND;--읽어올 행이 없을 때 빠져나와라.
IF V_TBLEMPSALRCD.SAL >= 5000 THEN V_GRADE := 'A';
ELSIF V_TBLEMPSALRCD.SAL >= 3000 THEN V_GRADE := 'B';
ELSIF V_TBLEMPSALRCD.SAL >= 1000 THEN V_GRADE := 'C';
ELSE V_GRADE := 'D';
END IF;
-- 등수 구하기 (RANK함수, COUNT() +1 , UPDATE등을 이용할 수 있다.)
/* 랭크 함수와 COUNT함수는 행을 다 읽은 다음 다시 한 행씩 읽어오며 등수를 매긴다.
EX)
1. 90
2. 85
3. 93
4. 90
5. 70
위와 같을 때 우선 1행을 읽어 '1'을 마크한다.
이제 2행을 읽어 1행과 값을 비교한다. 1행이 더크므로 무시하고 3행으로 간다.
3행과 1행을 비교하여 1행에 '1+1' 마크한다.
4행을 읽어 값이 같으므로 무시하고 5행으로 간다.
5행의 값도 비교되어진 후 1행에 등수는 '2'로 종료되어 진다.
위와같은 LOGIC으로 2행부터 끝까지 계산하여 MARK되어질 값을 결정한다. */
INSERT INTO TBLEMPSALRANK(EMPNO, ENAME, SAL, GRADE)
VALUES
(V_TBLEMPSALRCD.EMPNO,
V_TBLEMPSALRCD.ENAME,
V_TBLEMPSALRCD.SAL,
V_GRADE
);
END LOOP;
CLOSE CUR_TBLEMPSAL;
----------------------------------------------
OPEN CUR_TBLEMPSALRANK;
LOOP
FETCH CUR_TBLEMPSALRANK INTO V_EMPNO, V_SAL;
-- 자신의 사원번호 , 자신의 SAL 값
EXIT WHEN CUR_TBLEMPSALRANK%NOTFOUND;
/*
다른 모든 사원들의 SAL값을 읽어와서 자신의 SAL 값과 비교해주는
것이 필요하다. 비교해서 다른 사람의 SAL 값이 자신의 SAL 값보다
크다라면 자신의 석차는 1씩 증가하도록 한다.
*/
OPEN CUR_TBLEMPSALRANK2;
LOOP
FETCH CUR_TBLEMPSALRANK2 INTO V_SAL_OTHER;
EXIT WHEN CUR_TBLEMPSALRANK2%NOTFOUND;
IF V_SAL_OTHER > V_SAL THEN
V_SEOKCHA := V_SEOKCHA + 1;
END IF;
END LOOP;
CLOSE CUR_TBLEMPSALRANK2;
/* 최종적으로 자신의 SAL값과 모든 다른 사원들의 SAL값을 비교한 이후
석차를 변경하는 것이다. */
UPDATE TBLEMPSALRANK SET SEOKCHA = V_SEOKCHA
WHERE EMPNO = V_EMPNO; --한행 한행 읽어온 사원번호
V_SEOKCHA := 1;
END LOOP;
CLOSE CUR_TBLEMPSALRANK;
END;
/