ORACLE (feat. CURSOR)

2293 ワード

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;