MySQL 커서: 초보자 가이드

안녕하세요, 데이터베이스 열심히 공부하시는 분들에게! 오늘 우리는 MySQL 커서의 세계로 흥미로운 여정을 떠납니다. 코드를 한 줄도 작성해보지 않았다면 걱정하지 마세요 - 저는 당신의 친절한 안내자가 되겠습니다. 이 주제를 단계별로 탐구해보겠습니다. 그럼, 당신의 좋아하는 음료를 한 잔 챙기고, 함께 뛰어들어보겠습니다!

MySQL - Cursor

MySQL 커서는 무엇인가요?

이미 상상해보세요, 버페트에 있는 모습(음식이 생각나서 배고파지 않나요?). شما에게는 접시가 있고, 버페트 라인을 따라 이동하면서 하나씩 아이템을 골라냅니다. 데이터베이스의 세계에서 커서는 이와 유사하게 작동합니다. 커서는 당신의 접시처럼, 결과 집합에서 하나씩 행을 처리할 수 있게 해줍니다.

커서는 개별 행에 대한 연산을 수행할 때 특히 유용합니다. 전체 결과 집합이 아니라, 하나씩 데이터를 가져오는 개인 비서처럼 생각하면 됩니다.

MySQL 커서의 수명 주기

버페트에서 우리가 따르는 특정 절차(접시를 가져오고, 채우고, 먹고, 접시를 돌려주는 것)처럼, 커서도 수명 주기를 가지고 있습니다. 다음과 같이 나눌 수 있습니다:

  1. 커서 선언
  2. 커서 열기
  3. 커서에서 데이터 가져오기
  4. 커서 닫기

이제 이 각 단계를 자세히 탐구해보겠습니다.

커서 선언

먼저, MySQL에게 우리가 커서를 사용하고 싶다고 알려야 합니다. 이는 버페트 직원에게 당신이 접시를 채우기 시작할 준비가 되었다고 알리는 것과 같습니다.

이렇게 커서를 선언합니다:

DECLARE cursor_name CURSOR FOR SELECT_statement;

현실 세계의 예를 들어보겠습니다. 가정해봅시다 employees 테이블이 있고, 모든 직원의 이름을 가져오기 위한 커서를 생성하고 싶습니다:

DECLARE employee_cursor CURSOR FOR
SELECT first_name, last_name FROM employees;

이 예제에서 employee_cursor는 우리가 커서에 부여한 이름이며, SELECT 문은 커서가 가져올 데이터를 정의합니다.

커서 열기

이제 우리가 커서를 선언했으므로, 커서를 엽니다. 이는 버페트에서 접시를 실제로 들는 것과 같습니다.

이렇게 커서를 엽니다:

OPEN cursor_name;

이전 예제를 사용하면:

OPEN employee_cursor;

이 명령은 MySQL에게 SELECT 문을 실행하고 결과를 가져오기 위해 준비하도록 합니다.

커서에서 데이터 가져오기

이제 마법이 일어납니다! 우리는 데이터를 하나씩 가져올 수 있습니다. 버페트에서 개별 아이템을 골라내는 것과 같습니다.

이것이 데이터를 가져오기 위한 기본 문법입니다:

FETCH cursor_name INTO variable1, variable2, ...;

우리의 직원 예제를 계속하면:

DECLARE v_first_name VARCHAR(50);
DECLARE v_last_name VARCHAR(50);

FETCH employee_cursor INTO v_first_name, v_last_name;

이 코드에서 우리는 두 가지 변수를 선언하여 첫 이름과 마지막 이름을 저장하고, 다음 행을 커서에서 가져옵니다.

하지만 기억해야 할 것은, 우리는 일반적으로 모든 행을 가져오고 싶습니다. 이를 위해 우리는 반복문을 사용합니다. 예제를 보겠습니다:

DECLARE v_first_name VARCHAR(50);
DECLARE v_last_name VARCHAR(50);
DECLARE v_done INT DEFAULT FALSE;
DECLARE employee_cursor CURSOR FOR SELECT first_name, last_name FROM employees;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;

OPEN employee_cursor;

read_loop: LOOP
FETCH employee_cursor INTO v_first_name, v_last_name;
IF v_done THEN
LEAVE read_loop;
END IF;
-- v_first_name과 v_last_name을 처리하는 코드
END LOOP;

CLOSE employee_cursor;

이 코드는 반복문을 사용하여 행이 더 이상 없을 때까지 데이터를 계속 가져옵니다. 버페트에서 두 번째, 세 번째, 네 번째 접시를 더 가져가는 것과 같습니다.

커서 닫기

우리가 커서를 사용이 끝나면, 커서를 닫아야 합니다. 이는 버페트에서 접시를 돌려주는 것과 같습니다.

이렇게 커서를 닫습니다:

CLOSE cursor_name;

우리의 예제에서는:

CLOSE employee_cursor;

이 명령은 MySQL에게 우리가 커서를 더 이상 사용하지 않으며, 연관된 자원을 해제하도록 합니다.

모든 것을 함께 묶기

이제 우리가 배운 각 단계를 모아보겠습니다. 커서를 사용하여 모든 직원에게 소액 인상을 주는 예제를 보겠습니다:

DELIMITER //

CREATE PROCEDURE give_raises()
BEGIN
DECLARE v_emp_id INT;
DECLARE v_salary DECIMAL(10,2);
DECLARE v_done INT DEFAULT FALSE;
DECLARE emp_cursor CURSOR FOR SELECT employee_id, salary FROM employees;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;

OPEN emp_cursor;

read_loop: LOOP
FETCH emp_cursor INTO v_emp_id, v_salary;
IF v_done THEN
LEAVE read_loop;
END IF;

UPDATE employees SET salary = salary * 1.05 WHERE employee_id = v_emp_id;
END LOOP;

CLOSE emp_cursor;
END //

DELIMITER ;

이 절차에서 우리는 커서를 사용하여 모든 직원에게 5% 인상을 줍니다. 버페트에서 모든 접시에 약간의 추가 음식을 더하는 것과 같습니다!

커서 메서드 요약

이제 우리가 배운 커서 메서드를 요약하는 표를 제공하겠습니다:

메서드 문법 설명
DECLARE DECLARE cursor_name CURSOR FOR SELECT_statement; 커서와 그에 연관된 SELECT 문을 정의합니다
OPEN OPEN cursor_name; SELECT 문을 실행하고 결과를 가져오기 위해 준비합니다
FETCH FETCH cursor_name INTO variable1, variable2, ...; 커서에서 다음 행을 가져옵니다
CLOSE CLOSE cursor_name; 커서를 닫고 연관된 자원을 해제합니다

그렇습니다, 여러분! MySQL 커서의 세계로 첫 걸음을 냈습니다. 버페트를 탐색하는 것처럼, 커서를 사용하는 것도 연습이 필요할 수 있습니다. 하지만 시간과 인내와 함께, 데이터를 처리하는 프로가 될 것입니다. 행복하게 코딩하고, 데이터베이스가 항상 잘 먹고 효율적이기를 바랍니다!

Credits: Image by storyset