사용자 정의 변수(User-Defined Variable)란?
MySQL에서 사용자 정의 변수는 세션 전용 변수(session-specific variable)라고도 불립니다. 타입이 엄격하게 제한되지 않는(loosely typed) 변수로, 세션 도중 어느 시점이든 초기화할 수 있으며 세션이 종료될 때까지 그 값을 유지합니다.
사용자 정의 변수는 반드시 @ 기호를 접두사로 붙여야 합니다. 예를 들면 다음과 같습니다:
@anyVariableName;
사용자 정의 변수 초기화 방법 2가지
사용자 정의 변수를 초기화하는 방법에는 SET 명령어를 사용하는 방법과 SELECT 쿼리를 사용하는 방법, 두 가지가 있습니다.
첫 번째 방법은 다음과 같습니다:
SET @anyVariableName=anyValue;
두 번째 방법은 다음과 같습니다:
SELECT @anyVariableName :=anyValue;
주의할 점은 SELECT 쿼리에서 콜론(:)을 빠뜨리면 대입이 아닌 비교 연산식으로 평가된다는 것입니다. 이 경우 결과는 참(1) 또는 거짓(0)으로 반환됩니다:
mysql> select @m=10;
실행 결과는 다음과 같습니다:
+-------+ | @m=10 | +-------+ | 1 | +-------+ 1 row in set (0.00 sec)
로컬 변수(Local Variable)란?
로컬 변수는 저장 프로시저(stored procedure), 함수 등 프로그램 내부에서만 사용할 수 있는 변수입니다. DECLARE 키워드와 함께 선언하며, 사용자 정의 변수와 달리 @ 접두사가 필요하지 않습니다.
로컬 변수를 선언하는 기본 문법은 다음과 같습니다:
DECLARE yourVariableName dataType;
핵심 차이점: 로컬 변수는 저장 프로시저가 호출될 때마다 NULL 값으로 매번 새롭게 초기화됩니다. 반면 세션 전용 변수인 사용자 정의 변수는 NULL로 재초기화되지 않고 값을 계속 유지합니다. 또한 한 사용자가 설정한 사용자 정의 변수는 다른 사용자가 볼 수 없으며, 해당 사용자의 세션 변수는 접속이 종료되면 자동으로 소멸됩니다.
저장 프로시저로 확인하는 두 변수의 동작 차이
이제 실제 예제를 통해 세션 전용 변수와 로컬 변수의 차이를 살펴보겠습니다. 로컬 변수와 사용자 정의 변수를 함께 사용하는 저장 프로시저를 생성하는 쿼리는 다음과 같습니다:
mysql> DELIMITER //
mysql> CREATE PROCEDURE sp_LocalAndUserDefinedVariableDemo()
-> BEGIN
-> DECLARE localVariable int default 10;
-> SET localVariable=localVariable+10;
-> SET @userVariable=@userVariable+10;
-> SELECT localVariable;
-> SELECT @userVariable;
-> END;
-> //
Query OK, 0 rows affected (0.39 sec)
mysql> DELIMITER ;먼저 사용자 정의 변수에 값을 설정합니다:
mysql> SET @userVariable=10; Query OK, 0 rows affected (0.00 sec)
첫 번째 호출
프로시저를 처음 호출하면 사용자 정의 변수는 10+10=20이 되고, 로컬 변수 역시 10+10=20이 됩니다.
mysql> CALL sp_LocalAndUserDefinedVariableDemo();
실행 결과:
+---------------+ | localVariable | +---------------+ | 20 | +---------------+ 1 row in set (0.32 sec) +---------------+ | @userVariable | +---------------+ | 20 | +---------------+ 1 row in set (0.34 sec) Query OK, 0 rows affected (0.36 sec)
두 번째 호출
두 번째 호출부터 차이가 드러납니다. 사용자 정의 변수는 이전 값 20을 그대로 유지한 상태에서 10을 더해 20+10=30이 되지만, 로컬 변수는 다시 기본값 10으로 초기화된 후 10+10=20이 됩니다.
mysql> CALL sp_LocalAndUserDefinedVariableDemo();
실행 결과:
+---------------+ | localVariable | +---------------+ | 20 | +---------------+ 1 row in set (0.00 sec) +---------------+ | @userVariable | +---------------+ | 30 | +---------------+ 1 row in set (0.01 sec) Query OK, 0 rows affected (0.02 sec)
세 번째 호출
세 번째 호출에서도 마찬가지입니다. 사용자 정의 변수는 값 30을 유지한 채 30+10=40이 되지만, 로컬 변수는 다시 10으로 초기화되어 10+10=20을 반환합니다.
정리
이 실험을 통해 알 수 있는 결론은 다음과 같습니다. 로컬 변수는 프로시저가 호출될 때마다 매번 초기화됩니다. 초기화 값은 NULL일 수도 있고, 위 예제처럼 DEFAULT 10처럼 지정한 기본값일 수도 있습니다. 즉, 프로시저가 호출될 때마다 로컬 변수는 항상 지정된 값으로 새로 설정되는 반면, 사용자 정의 변수는 세션이 유지되는 동안 값을 그대로 보존한다는 것이 두 변수의 가장 큰 차이점입니다.