`DECLARE` 문은 MySQL에서 저장 프로시저(Stored Procedure) 또는 트리거(Trigger) 안에서 변수(variable), 핸들러(handler), 또는 커서(cursor)를 선언할 때 사용하는 주요 키워드입니다. 이 문법은 명령문의 시작 부분에서만 사용 가능하며, 프로시저 및 트리거의 로직 안에서 변수를 관리하고 조작하기 위해 필수적입니다. 이번에는 `DECLARE` 문법과 함께 기본적인 사용법과 예제를 살펴보겠습니다.
주요 특징
- 스코프 제한:
`DECLARE`로 선언된 변수는 프로시저 또는 BEGIN...END 블록 내부에서만 유효합니다.
- 초기화 없음:
`DECLARE`로 선언된 변수는 초깃값을 가지지 않습니다. 사용하려면 별도의 `SET` 문으로 값을 초기화해야 합니다.
- 데이터 타입 지정:
변수 선언 시 반드시 데이터 타입(e.g., INT, VARCHAR 등)을 지정해야 합니다.
- 실행 위치 제한:
`DECLARE` 문은 BEGIN...END 블록 내의 첫 번째 섹션에서만 작성할 수 있습니다.
(다른 SQL문 뒤에 위치할 경우 오류가 발생합니다.)
사용 예시
1. 기초적인 변수 선언 및 사용
다음은 숫자형 변수를 선언하고 초기화한 뒤, `SELECT` 문의 결과를 여기에 저장해 활용하는 간단한 예입니다.
DELIMITER //
CREATE PROCEDURE GetUserCount()
BEGIN
-- 변수 선언
DECLARE userCount INT;
-- 변수 초기화
SET userCount = 0;
-- 변수에 SELECT 결과 값 저장
SELECT COUNT() INTO userCount FROM users;
-- 결과 출력
SELECT userCount AS TotalUsers;
END;
//
DELIMITER ;
설명:
- `DECLARE userCount INT;`를 사용하여 정수형 변수를 선언했습니다.
- `SET userCount = 0;`로 초깃값을 설정했습니다.
- `SELECT COUNT() INTO userCount`로 쿼리 결과를 변수에 저장했습니다.
- 마지막으로 해당 변수 값을 출력합니다.
2. 다양한 데이터 타입 선언하기
다른 데이터 타입을 활용한 변수를 선언하고 사용하는 예시입니다.
DELIMITER //
CREATE PROCEDURE UserInfo()
BEGIN
-- 변수 선언
DECLARE userId INT;
DECLARE userName VARCHAR(50);
DECLARE userEmail VARCHAR(100);
-- 변수 초기화
SET userId = 1; -- 예를 들어 userId에 1을 지정합니다.
-- 특정 ID 값으로 데이터 조회
SELECT name, email INTO userName, userEmail
FROM users
WHERE id = userId;
-- 결과 출력
SELECT userName AS UserName, userEmail AS UserEmail;
END;
//
DELIMITER ;
설명:
- 정수형 변수 `userId`, 문자형 변수 `userName`과 `userEmail`이 선언되었습니다.
- `SELECT ... INTO` 문법을 사용하여 각각의 변수에 데이터베이스 값을 저장합니다.
- 최종적으로 변수의 데이터를 출력했습니다.
3. 조건문과 함께 사용하기
`DECLARE`로 선언된 변수를 조건문(`IF...ELSE`)과 함께 활용하는 예시입니다.
DELIMITER //
CREATE PROCEDURE CheckUserStatus()
BEGIN
-- 변수 선언
DECLARE userStatus VARCHAR(20);
DECLARE userId INT;
-- 변수 초기화
SET userId = 5; -- 예: 특정 사용자 ID 5
-- 상태 조회
SELECT status INTO userStatus
FROM users
WHERE id = userId;
-- 조건문 사용
IF userStatus = 'active' THEN
SELECT 'User is active' AS StatusMessage;
ELSE
SELECT 'User is not active' AS StatusMessage;
END IF;
END;
//
DELIMITER ;
설명:
- `userStatus`라는 문자열 변수를 선언해 사용자의 상태를 저장했습니다.
- `IF` 조건문을 사용해 상태를 확인하고 동적으로 메시지를 출력했습니다.
주의점
- `DECLARE`는 BEGIN...END 블록에서 반드시 상단에 위치해야 함:
아래와 같은 코드는 실행 시 오류를 발생시킵니다.
BEGIN
SELECT NOW() INTO currentTime; -- 오류: DECLARE 전에 다른 SQL 실행 불가!
DECLARE currentTime DATETIME;
END;
변수 선언은 항상 SQL 선언 순서의 맨 첫 부분에 작성해야 합니다.
- 초기값은 자동 할당되지 않음:
변수를 선언 후 초기화 없이 사용하면, 값이 없으므로 오류를 반환할 수 있습니다.
DECLARE total INT;
SET total = NULL; -- 명시적 초기화 필요
- 지정된 데이터 유형 확인:
잘못된 데이터 유형을 사용하거나 길이를 초과하는 값이 할당되면 오류가 발생할 수 있습니다.
결론
MySQL의 `DECLARE` 문은 저장 프로시저나 트리거 내에서 데이터 흐름을 제어하고 데이터를 관리하는 중요한 도구입니다. 그 특성과 제한을 올바로 이해하면 효율적이고 유연한 데이터베이스 프로세스를 설계할 수 있습니다. 특히 변수 선언 규칙에 주의하며 데이터를 초기화하고 사용하는 것이 중요합니다. 이를 잘 활용하여 복잡한 로직도 효과적으로 처리해보세요!
참고 자료
- MySQL 공식 문서: [https://dev.mysql.com/doc/refman/8.0/en/declare-local-variable.html](https://dev.mysql.com/doc/refman/8.0/en/declare-local-variable.html)
- MySQL 데이터베이스 실용 예제: [ https://www.mysqltutorial.org/](https://www.mysqltutorial.org/)
'SQL > MYSQL' 카테고리의 다른 글
[MySQL] CASE 문 사용 방법 및 예시 (1) | 2024.12.20 |
---|---|
[MySQL] Local Variable 사용 방법 및 예시 (0) | 2024.12.19 |
[MySQL] Local Variable DECLARE 사용 방법 및 예시 (0) | 2024.12.17 |
[MySQL] Statement Labels 사용 방법 및 예시 (0) | 2024.12.12 |
[MySQL] BEGIN END 사용 방법 및 예시 (0) | 2024.12.11 |
[MySQL] DEALLOCATE PREPARE 사용 방법 및 예시 (0) | 2024.12.10 |
[MySQL] EXECUTE 사용 방법 및 예시 (1) | 2024.12.10 |
[MySQL] PREPARE 사용 방법 및 예시 (1) | 2024.12.09 |