ORACLE (feat. CURSOR)
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;
Author And Source
이 문제에 관하여(ORACLE (feat. CURSOR)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@ansalstmd/ORACLE-feat.-CURSOR
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
커서의 선언(CURSOR 커서 이름)
-> 커서 열기(OPEN 커서 이름)
[ LOOP문으로 가져올 행이 없을 때까지 반복
-> 커서에서 데이터 가져오기(FETCH)
-> 데이터 처리
]
-> 커서 닫기 (CLOSE 커서 이름)
-- 커서가 포함된 스토어드 프로시저를 작성
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();
-- 회원 등급 열 추가
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;
Author And Source
이 문제에 관하여(ORACLE (feat. CURSOR)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ansalstmd/ORACLE-feat.-CURSOR저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)