ORACLE (feat. CURSOR)

min seung moon·2021년 2월 23일
0

Oracle

목록 보기
18/23

CURSOR

  • 커서는 일반적으로 다음의 순서를 통해서 처리됨
  • 커서는 각 각의 데이터를 가공할 때 사용
커서의 선언(CURSOR 커서 이름)
-> 커서 열기(OPEN 커서 이름)
[ LOOP문으로 가져올 행이 없을 때까지 반복
-> 커서에서 데이터 가져오기(FETCH)
-> 데이터 처리
]
-> 커서 닫기 (CLOSE 커서 이름)

1. 커서 활용

1. 커서를 활용해서 회원의 평균 키를 구하는 스토어드 프로시저 작성

-- 커서가 포함된 스토어드 프로시저를 작성
CREATE OR REPLACE PROCEDURE cursorProc AS
    v_height NUMBER; -- 회원의 키
    v_cnt NUMBER := 0; -- 회원의 인원수(=읽은 행의 수)
    v_total NUMBER := 0; -- 회원 키의 합계
    -- (1) 커서 선언
    CURSOR userCursor IS
        SELECT height FROM userTbl;
BEGIN
    -- (2) 커서 열기
    OPEN userCursor;
    -- (3) 커서에서 데이터 가져오기 및 (4) 데이터 처리
    LOOP
        FETCH userCursor INTO v_height;
        EXIT WHEN userCursor%NOTFOUND; -- 데이터가 없으면 LOOP 종료
        v_total := v_total + v_height;
        v_cnt := v_cnt + 1;
    END LOOP;
    -- (5) 커서 닫기
    CLOSE userCursor;
    DBMS_OUTPUT.PUT_LINE('회원 키의 평균 ==>' || (v_total/v_cnt));
END;

-- 스토어드 프로시저 호출
SET SERVEROUTPUT ON;
EXECUTE cursorProc();

2. 회원 테이블(userTBL)에 회원 등급열을 하나 추가한 후 등급 업데이트

-- 회원 등급 열 추가
ALTER TABLE userTBL ADD grade NVARCHAR2(5);

-- 스토어드 프로시저 작성
CREATE OR REPLACE PROCEDURE gradeProc AS
    v_id CHAR(8); -- 회원 아이디
    v_total NUMBER(5) := 0; -- 총 구매액
    v_grade NVARCHAR2(5); -- 회원 등급
    -- (1) 커서 서언
    CURSOR userCursor IS
        SELECT U.userID, SUM(price*amount)
            FROM buyTBL B
                RIGHT OUTER JOIN userTBL U
                ON B.userID = U.userID
            GROUP BY U.userID, U.userName;
BEGIN
    -- (2) 커서 열기
     OPEN userCursor;
     -- (3) 커서에 데이터 가져오기 (4) 데이터 처리
     LOOP
        FETCH userCursor INTO v_id, v_total;
        EXIT WHEN userCursor%NOTFOUND; -- 데이터가 없으면 LOOP 종료
        CASE
            WHEN (v_total >= 1500) THEN v_grade := '최우수회원';
            WHEN (v_total >= 1000) THEN v_grade := '우수회원';
            WHEN (v_total >= 1) THEN v_grade := '일반회원';
            ELSE v_grade := '유령회원';
        END CASE;
        UPDATE userTBL SET grade = v_grade WHERE userID = v_id;
    END LOOP;
    -- (5) 커서 닫기
    CLOSE userCursor;
END;

-- 스토어드 프로시저 호출
EXEC gradeProc();
SELECT userID, userName, grade FROM userTBL;
profile
아직까지는 코린이!

0개의 댓글