us01

MySQL @ 세션 변수 본문

DB/MySQL

MySQL @ 세션 변수

us01 2020. 12. 11. 00:44

MySQL에서 @붙은 변수는 세션 변수라고 하며, @붙은 변수는 세션이 종료될 때까지 사용이 가능합니다
아래 간단한 예제를 참고해요

SET @z = 1;
DELIMITER //
SET @x = 1;
CREATE PROCEDURE dorepeat(do1 INT)
 BEGIN
  DECLARE y INT DEFAULT 1;
  
  REPEAT
   SET y = y + 1;
   UNTIL y > do1
  END REPEAT;
  
  SET @x = @x + 1;

  SELECT y, @x;
 END//
DELIMITER ;

CALL dorepeat(1);

 

간략하게 코드를 설명하자면 아래와 같습니다

1. 변수는 총 3개 @z(세션 변수), @x(세션 변수), y(지역 변수)를 선언했고, 위치를 잘 봐주세요
 - 위치: @z는 DELIMITER // 위, @x는 DELIMITER // 아래, y는 BEGIN ~ END 사이에 선언했습니다
2. dorepeat 프로시저 생성, call dorepeat(1)을 3번 호출한 결과는 아래와 같아요
 - 한 번 실행했을 때 y: 2, @x :2, @z: 2
 - 두 번 실행했을 때 y: 2, @x: 3, @z: 3
 - 세 번 실행했을 때 y: 2, @x: 4, @z: 4
 - 실행 할 때마다 @x, @z만 값이 올라갈 거예요 이제 세션 변수의 값이 어떻게 변하는지 볼 수 있도록 dorepeat 프로시저를 삭제하고 다시 동일한 프로시저를 생성해볼게요
  (삭제: DROP PROCEDURE IF EXISTS dorepeat; / 프로시저 조회: SHOW PROCEDURE STATUS; )
3. 다시 생성한 프로시저를 호출해봐요
 - 한 번 실행했을 때 y: 2, @x :2, @z: 5
 - 두 번 실행했을 때 y: 2, @x: 3, @z: 6
 - 세 번 실행했을 때 y: 2, @x: 4, @z: 7

@z 변수의 값만 초기화가 되지 않고 증가가 된게 보이시나요? 
@x 변수의 경우도 @z 동일한 세션 변수이지만 DELIMITER // 아래 선언(DELIMITER ; -> //)을 하여 세션 변수까지 다시 초기화가 된 값으로 출력이 되는 것을 확인할 수 있습니다
세션 변수라도 해도 선언되는 위치에 따라 생각한 것과 다르게 초기화가 될 수 있으니 유의하여 선언하세요

@z 변수를 보면 프로시저 내에 선언된 변수(지역 변수)가 아니기 때문에 어느 프로시저 내에서 호출하더라도 초기화가 되지 않는걸 볼 수 있습니다

아래 새로운 프로시저를 생성해볼까요

DELIMITER //
CREATE PROCEDURE call1()
 BEGIN
  SELECT @z, @x;
 END //
DELIMITER ;

CALL call1();
위에서 선언한 세션 변수가 잘 출력이 됐나요?

'DB > MySQL' 카테고리의 다른 글

MySQL View(뷰), Procedure(프로시저) 스크립트 내용 확인  (0) 2020.12.10
MySQL procedure 삭제  (0) 2020.12.10
MySQL PL/SQL DELEMITER //  (0) 2020.12.10