반응형
Ant_U
DBA 개미
Ant_U
전체 방문자
오늘
어제
  • 분류 전체보기 (262) N
    • AWS (3)
    • C# (1)
    • SQL (236) N
      • MYSQL (186) N
      • MSSQL (50)
    • 자격증 (20)
      • SQLD (12)
      • SQLP (8)

인기 글

최근 글

250x250
hELLO · Designed By 정상우.
Ant_U

DBA 개미

[MySQL] BEGIN END 사용 방법 및 예시
SQL/MYSQL

[MySQL] BEGIN END 사용 방법 및 예시

2024. 12. 11. 10:49
728x90
반응형


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는 복잡한 데이터를 처리하거나 제어 흐름을 추가할 때 없어서는 안 될 도구입니다. 저장 프로시저, 함수, 트리거 등 다양한 환경에서 활용될 수 있으며, 트랜잭션과의 결합을 통해 데이터 무결성을 보장하는 데에도 유용합니다.

728x90
반응형

'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
    'SQL/MYSQL' 카테고리의 다른 글
    • [MySQL] DECLARE 사용 방법 및 예시
    • [MySQL] Statement Labels 사용 방법 및 예시
    • [MySQL] DEALLOCATE PREPARE 사용 방법 및 예시
    • [MySQL] EXECUTE 사용 방법 및 예시
    Ant_U
    Ant_U

    티스토리툴바