소개
MySQL에서 Cursor(커서)는 프로그래머가 결과 집합의 각 행을 개별적으로 처리해야 하는 특정 조건에서 많이 사용됩니다. 커서는 SELECT 쿼리가 반환하는 여러 행의 결과를 순차적으로 처리할 수 있도록 도와줍니다. 이를 통해 프로시저 내부에서 반복적으로 데이터를 처리할 수 있습니다. 이 포스트에서는 FETCH 문을 사용해 Cursor로 데이터를 가져오는 방식을 쉽게 이해할 수 있도록 설명하고 예제를 제공하겠습니다.
주요 개념
MySQL에서 FETCH 문은 Cursor를 활용해 현재 열려있는 커서에서 다음 행을 가져옵니다. 이 프로세스는 프로시저 내에서 주로 사용되며 다음과 같은 단계로 이루어집니다:
1. Cursor 선언: 처리할 SELECT 쿼리를 기반으로 Cursor를 먼저 선언합니다.
2. Cursor 열기 (Open): 선언된 Cursor를 활성화합니다.
3. FETCH로 데이터 가져오기: Cursor에서 한 행씩 데이터를 가져옵니다.
4. Cursor 닫기 (Close): Cursor의 작업이 완료되면 닫아서 리소스를 반환합니다.
주요 특징
- 하나의 행씩 저장된 결과를 가져올 수 있으므로 큰 데이터스트림을 처리하기 용이합니다.
- 프로시저 내부에서 반복적으로 데이터를 처리할 수 있는 유용한 방법입니다.
- 다음 작업을 수행하기 위해 명시적으로 Cursor를 열고 닫아야 합니다.
사용 예시
아래 예제를 통해 Cursor와 FETCH 문의 사용법을 구체적으로 살펴보겠습니다.
예제: 직원 테이블의 데이터를 한 행씩 가져오기
다음은 employees라는 테이블의 데이터를 한 행씩 읽어서 출력하는 간단한 프로시저 예제입니다.
DELIMITER $$
CREATE PROCEDURE FetchEmployeeData()
BEGIN
-- 변수 선언
DECLARE emp_id INT;
DECLARE emp_name VARCHAR(100);
DECLARE emp_salary DECIMAL(10, 2);
DECLARE done INT DEFAULT 0;
-- 커서 선언
DECLARE employee_cursor CURSOR FOR
SELECT id, name, salary FROM employees;
-- 정지 핸들러 선언 (커서 데이터가 더 이상 없을 때 루프 종료를 처리)
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 커서 열기
OPEN employee_cursor;
-- 반복문을 통한 데이터 FETCH
FETCH_LOOP: LOOP
FETCH employee_cursor INTO emp_id, emp_name, emp_salary;
-- 더 이상 데이터가 없으면 루프 종료
IF done = 1 THEN
LEAVE FETCH_LOOP;
END IF;
-- 처리된 데이터를 출력 (여기서는 예제용으로 SELECT 사용)
SELECT CONCAT('ID: ', emp_id, ', Name: ', emp_name, ', Salary: ', emp_salary) AS EmployeeData;
END LOOP;
-- 커서 닫기
CLOSE employee_cursor;
END$$
DELIMITER ;
예제 설명
1. 변수 선언:
- emp_id, emp_name, emp_salary 변수는 커서로부터 데이터를 가져와 저장할 목적으로 선언되었습니다.
- done 변수는 핸들러에서 설정됩니다. FETCH 실행 시 더 이상 데이터가 없으면 done을 1로 설정합니다.
2. Cursor 선언:
- employee_cursor는 SELECT id, name, salary FROM employees 쿼리를 수행하도록 정의했습니다.
3. 핸들러 정의:
- DECLARE CONTINUE HANDLER FOR NOT FOUND는 데이터가 더 이상 없을 경우 done 값을 1로 설정하여 루프를 종료할 준비를 합니다.
4. Cursor 사용:
- OPEN employee_cursor: Cursor를 열어 작업을 시작합니다.
- FETCH employee_cursor INTO emp_id, emp_name, emp_salary: Cursor의 현재 행 데이터를 변수에 삽입합니다.
- 루프를 통해 데이터를 한 행씩 처리하며, 더 이상 결과가 없으면 루프에서 빠져나옵니다.
5. Cursor 닫기:
- 작업이 끝난 후 CLOSE employee_cursor를 호출하여 메모리 리소스를 반환합니다.
장단점 분석
장점:
- 커서를 통해 데이터셋의 각 행별로 세밀한 처리가 가능.
- 대규모 데이터 작업 시 반복적으로 데이터를 처리하는 기능 제공.
- 배치 작업이나 보고서 생성 시 유용.
단점:
- 단순 SELECT로 처리 가능한 작업에 사용하면 성능이 저하될 수 있음.
- 데이터가 클 경우 반복적인 FETCH로 인해 느릴 수 있으므로 규모가 큰 작업에는 부적합.
결론
MySQL의 Cursor와 FETCH 문은 대규모 데이터셋에서 개별 행들에 대해 순차적으로 작업을 수행할 때 매우 유용한 기능입니다. 하지만 모든 상황에서 적합한 것은 아니므로, 성능을 고려하여 사용하는 것이 중요합니다. Cursor는 주로 특수한 데이터 처리 요건이나 정교한 데이터 로직을 구현할 때 활용하세요.
참고 자료
- [MySQL 공식 문서: Cursors 사용법](https://dev.mysql.com/doc/refman/8.0/en/cursors.html)
- [MySQL 8.0 릴리스 노트](https://dev.mysql.com/doc/relnotes/mysql/8.0/en/)
'SQL > MYSQL' 카테고리의 다른 글
[MySQL] Cursor Open 문 사용 방법 및 예시 (0) | 2025.01.03 |
---|---|
[MySQL] Cursor DECLARE 문 사용 방법 및 예시시 (0) | 2024.12.30 |
[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 |