반응형
Ant_U
DBA 개미
Ant_U
전체 방문자
오늘
어제
  • 분류 전체보기 (218)
    • AWS (3)
    • C# (1)
    • SQL (200)
      • MYSQL (150)
      • MSSQL (50)
    • SQLD (12)

인기 글

최근 글

250x250
hELLO · Designed By 정상우.
Ant_U

DBA 개미

[MySQL] Cursor FETCH 문 사용 방법 및 예시
SQL/MYSQL

[MySQL] Cursor FETCH 문 사용 방법 및 예시

2024. 12. 31. 12:12
728x90
반응형

 

 


소개
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/)

728x90
반응형

'SQL > MYSQL' 카테고리의 다른 글

[MySQL] DECLARE HANDLER 문 사용 방법 및 예시  (0) 2025.01.06
[MySQL] DECLARE CONDITION 문 사용 방법 및 예시  (0) 2025.01.06
[MySQL] 서버 사이드 커서 문 사용 방법 및 예시  (0) 2025.01.04
[MySQL] Cursor Open 문 사용 방법 및 예시  (1) 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
    'SQL/MYSQL' 카테고리의 다른 글
    • [MySQL] 서버 사이드 커서 문 사용 방법 및 예시
    • [MySQL] Cursor Open 문 사용 방법 및 예시
    • [MySQL] Cursor DECLARE 문 사용 방법 및 예시시
    • [MySQL] Cursor CLOSE 문 사용 방법 및 예시
    Ant_U
    Ant_U

    티스토리툴바