MySQL 저장 프로시저에서 BEGIN/END 블록 안에 변수를 선언하면, 그 변수의 유효 범위(scope)는 해당 블록 내부로 한정됩니다. 또한 서로 다른 BEGIN/END 블록 안에 동일한 이름의 변수를 각각 선언하는 것도 전혀 문법 위반이 아니며, 이 경우 각 변수는 자신이 속한 블록 안에서만 유효하게 동작합니다.
아래 예제는 변수의 유효 범위를 직접 확인할 수 있도록 작성한 저장 프로시저입니다.
예제
mysql> Create Procedure Scope_variables()
-> BEGIN
-> DECLARE A Varchar(5) Default 'outer';
-> BEGIN
-> DECLARE A Varchar(5) Default 'inner';
-> SELECT A;
-> END;
-> SELECT A;
-> END;
-> //
Query OK, 0 rows affected (0.08 sec)
위 프로시저에는 같은 이름을 가진 두 개의 변수 A가 존재합니다. 여기서 중요한 점은, 내부 블록에서 선언된 변수가 해당 블록이 유효한 동안에는 외부 변수보다 우선순위를 가진다는 것입니다. 그리고 첫 번째 END에 도달하는 순간 내부 변수는 소멸하는데, 이러한 상태를 '범위 밖(OUT OF SCOPE)'이라고 부릅니다.
이 개념을 실제로 확인하려면 아래와 같이 프로시저를 호출해 보면 됩니다.
mysql> CALL Scope_variables();
+-------+
| A |
+-------+
| inner |
+-------+
1 row in set (0.00 sec)
+-------+
| A |
+-------+
| outer |
+-------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
결과 해석
실행 결과를 살펴보면, 첫 번째 SELECT 문은 내부 블록의 값인 inner를 반환하고, 두 번째 SELECT 문은 외부 블록의 값인 outer를 반환합니다. 이는 내부 블록이 종료되면서 내부 변수가 메모리에서 사라졌고, 이후에는 외부 변수만 남게 되었기 때문입니다.
정리하자면, MySQL 저장 프로시저의 변수 스코프는 블록 단위로 결정되며, 내부 블록의 변수는 같은 이름의 외부 변수를 일시적으로 가리는(shadowing) 효과를 가집니다. 따라서 복잡한 로직을 작성할 때는 변수 이름의 중복으로 인한 혼동을 피하기 위해 스코프 규칙을 정확히 이해하고 사용하는 것이 좋습니다.