MySQL에서는 하나의 저장 프로시저(Stored Procedure) 내부에서 다른 저장 프로시저를 호출하는 것이 충분히 가능합니다. 이는 여러 작업을 모듈 단위로 나누어 관리할 수 있게 해주기 때문에 코드의 재사용성과 유지보수성을 크게 높여줍니다.
이번 글에서는 한 저장 프로시저가 다른 저장 프로시저를 호출하여 last_insert_id() 값을 확인하는 예제를 통해 그 방법을 살펴보겠습니다.
예제 준비: 테이블 및 첫 번째 프로시저 생성
먼저 자동 증가(AUTO_INCREMENT) 기본 키를 가진 테이블을 생성합니다.
mysql> DELIMITER //
mysql> CREATE TABLE employee.tbl (
-> Id INT NOT NULL AUTO_INCREMENT,
-> Name VARCHAR(30) NOT NULL,
-> PRIMARY KEY(Id)
-> //
Query OK, 0 rows affected (3.87 sec)
다음으로, 테이블에 데이터를 삽입하는 첫 번째 저장 프로시저 insert1()을 만듭니다.
mysql> CREATE PROCEDURE insert1()
-> BEGIN
-> INSERT INTO employee.tbl(name) VALUES ('Ram');
-> END //
Query OK, 0 rows affected (0.10 sec)
두 번째 프로시저에서 첫 번째 프로시저 호출하기
이제 핵심 부분입니다. 두 번째 저장 프로시저 insert2() 안에서 CALL 문을 사용해 첫 번째 프로시저인 insert1()을 호출하고, 바로 이어서 last_insert_id()로 방금 삽입된 레코드의 ID를 조회합니다.
mysql> CREATE PROCEDURE insert2()
-> BEGIN
-> CALL insert1();
-> SELECT last_insert_id();
-> END //
Query OK, 0 rows affected (0.11 sec)
mysql> DELIMITER ;
mysql> CALL insert2();
+------------------+
| last_insert_id() |
+------------------+
| 1 |
+------------------+
1 row in set (0.36 sec)
Query OK, 0 rows affected (0.37 sec)
결과 분석
위 결과 집합을 보면, insert2()를 호출했을 때 내부적으로 insert1()이 실행되어 employee.tbl 테이블에 첫 번째 값('Ram')이 삽입되었습니다. 그리고 같은 프로시저 안에서 last_insert_id()를 조회한 결과 1이 반환된 것을 확인할 수 있습니다.
정리
- 저장 프로시저 내부에서는
CALL 프로시저명();구문으로 다른 저장 프로시저를 자유롭게 호출할 수 있습니다. - 호출된 프로시저에서 수행한 INSERT 작업의 자동 증가 ID는
last_insert_id()를 통해 확인할 수 있으며, 이 값은 해당 세션 내에서 유지됩니다.
이처럼 프로시저 간 호출을 활용하면 공통 로직(데이터 삽입, 검증 등)을 별도의 프로시저로 분리하여 재사용할 수 있어, 대규모 애플리케이션의 데이터베이스 로직을 더 깔끔하게 구조화할 수 있습니다.