✍️ Study Note
스토어드 프로시저 커서 생성
커서를 생성하여 반복 구간을 설정함으로서, 특정 작업을 행이 끝날 때까지 진행하도록 함.
쿼리 순서
- 변수 선언
- 커서 선언 (작업 진행할 열 선택)
- 반복조건 설정 (행이 끝날때까지 진행하기 위해)
- 커서 오픈 후, 반복구간 및 반복구간 종료시점 설정
- 진행할 작업 세팅
- 커서 닫기
예시 #1
DELIMITER $$
CREATE PROCEDURE CURSORPROC()
BEGIN
DECLARE USERHEIGHT INT; -- 고객 키 (데이터)
DECLARE CNT INT DEFAULT 0; -- 고객 수 (읽은 행의 수)
DECLARE TOTALHEIGHT INT DEFAULT 0; -- 키의 합계
DECLARE ENDOFROW BOOLEAN DEFAULT FALSE;
DECLARE USERCUROR CURSOR FOR -- (1) 커서 선언
SELECT HEIGHT FROM USERTBL;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET ENDOFROW = TRUE; -- (2) 반복조건 선언, 행의 끝이 오면 TRUE로 변경됨
OPEN USERCUROR; -- (3) 커서 열기
CURSOR_LOOP : LOOP -- (4) 반복구간 지정
FETCH USERCUROR INTO USERHEIGHT;
IF ENDOFROW THEN LEAVE CURSOR_LOOP; -- 읽을 행이 없으면 LOOP 종료
END IF;
SET CNT = CNT +1; -- 읽을 행이 있다면, 다음 행 이동을 위해 +1
SET TOTALHEIGHT = TOTALHEIGHT + USERHEIGHT; -- TOTAL 확인을 위해 조회한 키 더하기
END LOOP CURSOR_LOOP;
SELECT CONCAT('고객 키의 평균 ==>', (TOTALHEIGHT/CNT));
CLOSE USERCUROR; -- (5) 커서 닫기
END $$
DELIMITER ;
CALL CURSORPROC();
예시 #2
DELIMITER $$
CREATE PROCEDURE GRADEPROC()
BEGIN
DECLARE ID VARCHAR(10); -- 변수 선언
DECLARE HAP BIGINT;
DECLARE USERGRADE CHAR(5);
DECLARE ENDOFROW BOOLEAN DEFAULT FLASE;
DECLARE USERCUROR CURSOR FOR -- (1) 커서 선언
SELECT U.USERID, SUM(PRICE*AMOUNT)
FROM BUYTBL B RIGHT JOIN USERTBL U
ON B.USERID = U.USERID
GROUP BY U.USERID, U.NAME;
DECLARE CONTINUE HANDLER FOR NOT FOUND -- (2) 반복조건 선언, 행의 끝이 오면 TRUE로 변경되고 종료.
SET ENDOFROW = TRUE;
OPEN USERCUROR; -- (3) 커서 열기
GRADE_LOOP : LOOP -- (4) 반복구간 지정
FETCH USERCUROR INTO ID, HAP; -- 위에서 선언한 커서 사용
IF ENDOFROW THEN LEAVE GRADE_LOOP; -- 읽을 행이 없으면 LOOP 종료
END IF;
CASE -- 읽을 행이 있다면, 조건 설정
WHEN (HAP >=1500) THEN SET USERGRADE = '최우수고객';
WHEN (HAP >=1000) THEN SET USERGRADE = '우수고객';
WHEN (HAP >=1) THEN SET USERGRADE = '일반고객';
ELSE SET USERGRADE = '유령고객';
END CASE;
UPDATE USERTBL SET GRADE = USERGRADE WHERE USERID = ID; -- 확인한 고객등급을 테이블에 업데이트
END LOOP GRADE_LOOP;
CLOSE USERCUROR; -- (5) 커서 닫기
END $$
DELIMITER ;
CALL GRADEPROC();
SELECT * FROM USERTBL;
'코딩공부' 카테고리의 다른 글
[패캠] 파이썬 이커머스 데이터 분석 올인원 패키지 #1 고객별 연간 지출액 (0) | 2021.12.21 |
---|---|
[SQL] 데이터 분석을 위한 SQL 레시피 : 1~2장 (0) | 2021.11.13 |
[SQL] MYSQL 스토어드 함수 (0) | 2021.11.08 |
[SQL] MYSQL 스토어드 프로시저 (0) | 2021.11.07 |
[SQL] MySQL 트리거 (0) | 2021.11.06 |