MySQL 저장 프로시저에서 INOUT 매개변수는 하나의 매개변수로 값을 입력받고 결과를 다시 반환할 수 있어 매우 유용합니다. 아래 예제를 통해 INOUT 매개변수를 사용하는 저장 프로시저의 생성과 실행 과정을 살펴보겠습니다.
INOUT 매개변수를 사용한 저장 프로시저 만들기
먼저 카운터 역할을 하는 간단한 저장 프로시저를 생성해 보겠습니다.
mysql> DELIMITER // ;
mysql> Create PROCEDURE counter(INOUT count INT, IN increment INT)
-> BEGIN
-> SET count = count + increment;
-> END //
Query OK, 0 rows affected (0.03 sec)
매개변수 설명
- count: INOUT 매개변수로, 프로시저에 값을 전달함과 동시에 처리된 결과값을 다시 반환할 수 있습니다.
- increment: IN 매개변수로, 사용자가 전달한 값을 읽기만 하며 프로시저 내부에서 수정된 값은 외부로 반환되지 않습니다.
위 프로시저는 count에 increment 값을 더한 후 그 결과를 count에 다시 저장합니다. INOUT 특성 덕분에 이 결과값은 호출한 세션의 변수에 그대로 반영됩니다.
저장 프로시저 호출하고 결과 확인하기
생성한 프로시저를 실제로 호출하여 동작을 확인해 보겠습니다.
mysql> DELIMITER ;
mysql> SET @counter = 0;
Query OK, 0 rows affected (0.00 sec)
mysql> CALL counter(@Counter, 1);
Query OK, 0 rows affected (0.00 sec)
mysql> Select @Counter;
+----------+
| @Counter |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
초기값이 0이었던 @Counter 변수가 프로시저 호출 후 1로 변경되었습니다. 이번에는 증가값을 5로 지정하여 다시 호출해 보겠습니다.
mysql> CALL counter(@Counter, 5);
Query OK, 0 rows affected (0.00 sec)
mysql> Select @Counter;
+----------+
| @Counter |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec)
실행 결과 분석
두 번째 호출에서 @Counter 변수는 기존 값 1에 5가 더해진 6이 되었습니다. 이처럼 INOUT 매개변수는 이전 상태를 기억하며 누적적으로 값을 갱신할 수 있기 때문에 카운터, 누계 계산 등 상태를 유지해야 하는 로직에 적합합니다.
참고로 DELIMITER 명령은 저장 프로시저 내부의 세미콜론(;)이 일반 SQL 문 종결자로 해석되지 않도록 구분자를 임시로 변경하는 역할을 하며, 프로시저 생성이 완료된 후에는 원래대로 되돌려 주어야 합니다.