소개
MySQL에서 Cursor(커서)는 저장 프로시저 또는 저장 함수 내에서 데이터의 행 집합을 순차적으로 처리하기 위해 사용되는 기능입니다. Cursor OPEN Statement는 커서를 활성화하여 데이터베이스에서 커서에 정의된 SQL 쿼리를 실행하고, 해당 결과 집합을 메모리에 로드하는 역할을 합니다. 이 게시물에서는 Cursor OPEN Statement에 대해서 무엇인지, 어떻게 사용하는지, 그리고 간단한 코드 예제를 통해 이해할 수 있도록 설명하겠습니다.
주요 특징
- 커서를 활성화: OPEN 문은 커서를 실행 상태로 변경하여 데이터 집합을 준비합니다.
- 저장 프로시저에서 사용: 커서는 일반적으로 저장 프로시저 또는 트리거 내부에서 사용됩니다.
- 순차적 데이터 처리: 한 번에 한 행씩 데이터를 처리할 수 있어 복잡한 비즈니스 로직에 유용합니다.
사용 예시
다음은 커서를 열고 데이터를 가져오는 간단한 예제입니다.
예제: employees 테이블의 데이터를 커서를 통해 처리하기
여기서는 직원 정보가 담긴 employees 테이블의 특정 속성을 반복 처리하는 프로시저를 작성해 보겠습니다.
DELIMITER //
CREATE PROCEDURE process_employees()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE emp_name VARCHAR(100);
-- 커서 선언
DECLARE emp_cursor CURSOR FOR SELECT name FROM employees;
-- 종료 핸들러 선언
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 커서 열기
OPEN emp_cursor;
read_loop: LOOP
FETCH emp_cursor INTO emp_name; -- 커서에서 한 행 가져오기
IF done THEN
LEAVE read_loop; -- 더 이상 가져올 행이 없으면 루프 종료
END IF;
-- 가져온 데이터를 사용하여 비즈니스 로직 수행
SELECT CONCAT('Processing: ', emp_name);
END LOOP;
-- 커서 닫기
CLOSE emp_cursor;
END //
DELIMITER ;
실행 방법
1. 먼저 위 프로시저를 한 번 생성합니다.
2. 그런 다음 프로시저를 호출합니다.
CALL process_employees();
결과
각 직원의 이름이 Processing: <name> 형태로 출력됩니다.
코드 흐름 설명
1. 커서를 선언: DECLARE emp_cursor CURSOR FOR ...를 통해 employees 테이블의 데이터 집합을 정의합니다.
2. 커서 열기: OPEN emp_cursor로 커서를 활성화합니다.
3. 데이터 가져오기: FETCH emp_cursor INTO emp_name을 통해 커서에서 행을 가져옵니다.
4. 종료 핸들러: 더 이상 가져올 데이터가 없을 경우 NOT FOUND 핸들러가 done 값을 1로 설정합니다.
5. 루프 종료: done 값이 1이 되면 루프를 종료합니다.
6. 커서 닫기: 사용이 끝난 커서는 CLOSE emp_cursor로 닫아 줍니다.
장단점 분석
장점:
- 데이터 처리의 유연성: 한 번에 전체 데이터를 가져오지 않고 한 행씩 처리할 수 있어 메모리 사용을 줄입니다.
- 복잡한 로직 지원: 특정 데이터 집합에 대해 순차적인 데이터 처리가 필요한 상황에서 유용합니다.
단점:
- 성능 제약: 한 행씩 가져오기 때문에 대량 데이터를 처리할 경우 속도가 느릴 수 있습니다.
- 복잡성 증가: 프로시저 내에서 커서를 관리해야 하므로 코드가 다소 복잡해질 수 있습니다.
결론
MySQL의 Cursor OPEN Statement는 대량 데이터를 순차적으로 처리해야 하는 저장 프로시저에서 매우 유용하게 사용됩니다. 단, 성능 및 복잡성을 고려하여 적절히 사용해야 합니다. 위의 예제를 직접 실행하며 작동 원리를 이해해 보면 실무에서도 쉽게 응용할 수 있을 것입니다.
'SQL > MYSQL' 카테고리의 다른 글
[MySQL] 서버 사이드 커서 문 사용 방법 및 예시 (0) | 2025.01.04 |
---|---|
[MySQL] Cursor FETCH 문 사용 방법 및 예시 (0) | 2024.12.31 |
[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 |