MySQL의 `BEGIN ... END` Compound Statement는 하나의 블록 안에 여러 SQL 문장을 그룹화하고 실행할 수 있는 기능을 제공합니다. 특히, 저장 프로시저나 저장 함수, 트리거(Trigger)와 같이 복잡한 로직을 처리할 때 유용합니다.
이 문장은 프로그래밍 언어의 코드 블록과 유사하며, 제어 흐름이나 복잡한 작업을 수행할 때 주로 사용됩니다.
기본 구조
BEGIN
-- SQL 구문들
END;
이 구조를 통해 여러 SQL 문장을 하나의 트랜잭션 단위로 묶거나 단일 논리 작업으로 처리할 수 있습니다. `BEGIN ... END` 블록 내부에서는 각 문장이 `;`로 끝나야 합니다. 단, SQL로 작성하는 저장 프로시저나 함수에서는 별도의 구문 구분자를 설정(`DELIMITER`)해야 블록의 끝(`END;`)을 명확히 구분할 수 있습니다.
사용법
`BEGIN ... END`를 사용하는 주요 구성 요소는 아래와 같습니다:
1. 변수 선언
`DECLARE` 키워드를 통해 변수를 선언합니다. 선언된 변수는 해당 블록 내에서만 유효합니다.
DECLARE var_name datatype [DEFAULT default_value];
2. 조건문 및 반복문
`IF`, `CASE`, `LOOP`, `WHILE`, `REPEAT` 등의 제어 흐름 구문을 함께 사용할 수 있습니다.
3. 핸들러(Handlers)
예외 상황(Exception)을 처리하기 위한 `DECLARE HANDLER` 구문을 사용할 수 있습니다.
예제: 사원의 기본급 업데이트
다음은 `BEGIN ... END` Compound Statement를 활용한 저장 프로시저 생성 예제입니다. 특정 조건에 따라 사원의 기본급을 변경하는 로직을 작성해 보겠습니다.
예제 코드
DELIMITER $$
CREATE PROCEDURE UpdateEmployeeSalary (IN emp_id INT, IN raise_amount DECIMAL(10,2))
BEGIN
-- 변수 선언
DECLARE current_salary DECIMAL(10,2);
-- 현재 급여 가져오기
SELECT salary INTO current_salary
FROM employees
WHERE employee_id = emp_id;
-- 조건문으로 급여 업데이트
IF current_salary IS NOT NULL THEN
UPDATE employees
SET salary = current_salary + raise_amount
WHERE employee_id = emp_id;
ELSE
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Invalid Employee ID';
END IF;
END$$
DELIMITER ;
설명
- 입력 매개변수: `emp_id`와 `raise_amount`는 각각 사원의 ID와 인상 금액을 받아옵니다.
- DECLARE 변수: `current_salary` 변수를 선언하여 현재 급여를 저장합니다.
- SELECT INTO: 사원의 현재 급여를 쿼리로 가져와 변수에 저장합니다.
- IF 조건문: 사원의 ID가 유효하면 급여를 업데이트하고, 유효하지 않은 경우 에러 메시지를 반환합니다(`SIGNAL` 명령어 사용).
트랜잭션과 함께 사용하기
`BEGIN ... END` 문장은 일반적인 트랜잭션 관리와도 함께 사용할 수 있습니다.
예제 코드: 트랜잭션 롤백 처리
DELIMITER $$
CREATE PROCEDURE TransferFunds (
IN sender_id INT,
IN receiver_id INT,
IN amount DECIMAL(10,2)
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
-- 에러 발생 시 롤백
ROLLBACK;
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Transaction Failed';
END;
START TRANSACTION;
-- 송금자 잔고 차감
UPDATE accounts
SET balance = balance - amount
WHERE account_id = sender_id;
-- 수금자 잔고 추가
UPDATE accounts
SET balance = balance + amount
WHERE account_id = receiver_id;
COMMIT;
END$$
DELIMITER ;
설명
- `START TRANSACTION`: 트랜잭션을 시작하며, 모든 작업이 성공적으로 완료되었을 때만 `COMMIT` 됩니다.
- 핸들러: 에러가 발생하면 `ROLLBACK`으로 처리되고, 사용자 정의 메시지가 반환됩니다.
유의사항
1. DELIMITER 사용
- 블록 작성 시 `DELIMITER $$`와 같이 구문 구분자를 변경해야 `BEGIN ... END` 블록 안의 세미콜론(`;`) 구문과 혼동되지 않습니다.
2. 내부 변수를 외부에서 사용할 수 없음
- `DECLARE`로 선언된 변수는 해당 블록 내에서만 사용 가능하며, 블록 밖으로 접근할 수 없습니다.
3. 복잡한 로직
- 복잡한 루프나 조건문을 사용할 경우, 적절한 주석으로 가독성을 높이는 것이 중요합니다.
결론
MySQL `BEGIN ... END` Compound Statement는 복잡한 데이터를 처리하거나 제어 흐름을 추가할 때 없어서는 안 될 도구입니다. 저장 프로시저, 함수, 트리거 등 다양한 환경에서 활용될 수 있으며, 트랜잭션과의 결합을 통해 데이터 무결성을 보장하는 데에도 유용합니다.
'SQL > MYSQL' 카테고리의 다른 글
[MySQL] Local Variable 사용 방법 및 예시 (0) | 2024.12.19 |
---|---|
[MySQL] Local Variable DECLARE 사용 방법 및 예시 (0) | 2024.12.17 |
[MySQL] DECLARE 사용 방법 및 예시 (0) | 2024.12.16 |
[MySQL] Statement Labels 사용 방법 및 예시 (0) | 2024.12.12 |
[MySQL] DEALLOCATE PREPARE 사용 방법 및 예시 (0) | 2024.12.10 |
[MySQL] EXECUTE 사용 방법 및 예시 (1) | 2024.12.10 |
[MySQL] PREPARE 사용 방법 및 예시 (1) | 2024.12.09 |
[MySQL] STOP GROUP_REPLICATION 사용 방법 및 예시 (0) | 2024.12.04 |