소개
MySQL의 커서(Cursor)는 저장 프로시저나 트리거 내에서 다중 행 결과 집합을 순차적으로 처리할 수 있는 도구입니다. 이 글에서는 MySQL Cursor를 선언(DECLARE)하여 사용하는 방법에 대해 중점적으로 설명하고, 간단한 예제 코드도 함께 다뤄 보겠습니다.
주요 특징
- 다중 행 결과 처리: SELECT 문이 반환하는 여러 행을 하나씩 순서대로 처리 가능.
- 저장 프로시저와 함께 사용: 일반적으로 저장 프로시저 내에서 커서를 선언하고 사용.
- 임시 상태 유지: 커서는 결과 집합을 메모리에 로드하여 처리 상태를 유지.
사용 예시
아래는 데이터베이스에 존재하는 employees 테이블에서 모든 직원의 이름을 순차적으로 처리하는 예제입니다.
예제 코드
DELIMITER //
CREATE PROCEDURE ProcessEmployees()
BEGIN
-- 커서 선언을 위한 변수 선언
DECLARE done INT DEFAULT 0;
DECLARE emp_name VARCHAR(100);
-- 커서를 선언하고 특정 SELECT 문의 결과를 참조
DECLARE emp_cursor CURSOR FOR SELECT name FROM employees;
-- 반복문 종료를 제어하기 위해 HANDLER 선언
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 커서 열기
OPEN emp_cursor;
REPEAT
-- 커서에서 데이터를 하나씩 가져오기
FETCH emp_cursor INTO emp_name;
-- 가져온 데이터 출력(여러 프로세스 추가 가능)
IF NOT done THEN
SELECT emp_name;
END IF;
UNTIL done END REPEAT;
-- 커서 닫기
CLOSE emp_cursor;
END //
DELIMITER ;
코드 설명
1. DECLARE emp_cursor:
- emp_cursor라는 이름의 커서를 선언하고, SELECT name FROM employees로 정의된 결과 집합을 참조하도록 설정합니다.
2. DECLARE HANDLER:
- 커서가 결과 집합의 마지막에 도달하면 더 이상 가져올 데이터가 없음을 나타내기 위해 NOT FOUND 핸들러를 done 변수에 설정합니다.
3. 커서 열기 및 닫기:
- OPEN emp_cursor를 통해 커서를 열어 데이터를 처리할 준비를 합니다.
- 작업이 끝나면 메모리 누수를 방지하기 위해 CLOSE emp_cursor로 닫습니다.
4. FETCH 및 REPEAT:
- FETCH 명령으로 커서에서 한 행씩 데이터를 가져오고, REPEAT 및 IF NOT done을 사용해 조건에 따라 필요한 처리를 수행합니다.
장단점 분석
장점
- 유연성: 다중 행 결과 셋을 하나씩 처리할 수 있어 복잡한 비즈니스 로직에 적합.
- 가독성: 노드 기반으로 데이터를 처리하는 흐름을 명확히 보여줌.
- 변형 가능성: 각 행에 대해 원하는 데이터 조작을 손쉽게 추가 가능.
단점
- 성능 문제: 데이터가 많을 경우 커서 작업은 메모리와 성능에 부담을 줄 수 있음.
- 복잡성 증가: 간단한 작업을 위해 사용하면 오히려 코드가 복잡해질 수 있음.
- 병렬 처리 지원 부족: MySQL 커서는 기본적으로 순차적으로 행을 처리하며 병렬 작업에는 제약이 있음.
결론
MySQL의 DECLARE를 활용한 커서 사용은 데이터베이스 내에서 복잡한 다중 행 연산을 효과적으로 처리할 수 있는 도구입니다. 하지만, 커서를 잘못 사용하면 성능 문제가 나타날 수 있으므로 데이터 크기와 실행 목적에 맞게 신중히 활용해야 합니다. 커서를 사용하지 않고도 해결할 수 있는 간단한 문제라면 SQL 자체의 집계 함수나 JOIN, 서브쿼리를 고려하는 것도 좋은 선택입니다.
참고 자료
- [MySQL 공식 문서 - 커서 사용 (https://dev.mysql.com/doc/refman/8.0/en/cursors.html)]
'SQL > MYSQL' 카테고리의 다른 글
[MySQL] Cursor Open 문 사용 방법 및 예시 (0) | 2025.01.03 |
---|---|
[MySQL] Cursor FETCH 문 사용 방법 및 예시 (0) | 2024.12.31 |
[MySQL] Cursor CLOSE 문 사용 방법 및 예시 (2) | 2024.12.29 |
[MySQL] WHILE 문 사용 방법 및 예시 (1) | 2024.12.28 |
[MySQL] RETURN 문 사용 방법 및 예시 (0) | 2024.12.27 |
[MySQL] REPEAT 문 사용 방법 및 예시 (0) | 2024.12.27 |
[MySQL] LOOP 문 사용 방법 및 예시 (0) | 2024.12.26 |
[MySQL] LEAVE 문 사용 방법 및 예시 (0) | 2024.12.26 |