저장 프로시저(Stored Procedure) 안에서 조건에 따라 다른 쿼리를 실행해야 하는 경우가 종종 있습니다. MySQL에서는 IF ELSE 문을 활용하면 이러한 조건부 로직을 손쉽게 구현할 수 있습니다. 이번 글에서는 두 개의 테이블을 만들고, 저장 프로시저의 매개변수 값에 따라 서로 다른 테이블을 조회하는 예제를 단계별로 살펴보겠습니다.
1. 첫 번째 테이블 생성 및 데이터 입력
먼저 예제에 사용할 테이블 DemoTable1을 생성합니다.
mysql> create table DemoTable1 ( Id int ); Query OK, 0 rows affected (0.62 sec)
INSERT 명령으로 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable1 values(10); Query OK, 1 row affected (0.19 sec) mysql> insert into DemoTable1 values(20); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable1 values(30); Query OK, 1 row affected (0.12 sec)
SELECT 문으로 테이블의 전체 레코드를 확인합니다.
mysql> select *from DemoTable1;
실행 결과는 다음과 같습니다.
+------+
| Id |
+------+
| 10 |
| 20 |
| 30 |
+------+
3 rows in set (0.00 sec)
2. 두 번째 테이블 생성 및 데이터 입력
이어서 비교용 테이블 DemoTable2를 생성합니다.
mysql> create table DemoTable2 ( Id int ); Query OK, 0 rows affected (1.07 sec)
마찬가지로 레코드를 삽입합니다.
mysql> insert into DemoTable2 values(40); Query OK, 1 row affected (0.13 sec) mysql> insert into DemoTable2 values(50); Query OK, 1 row affected (0.17 sec) mysql> insert into DemoTable2 values(60); Query OK, 1 row affected (0.11 sec)
테이블 내용을 조회해 보면 다음과 같습니다.
mysql> select *from DemoTable2;
+------+
| Id |
+------+
| 40 |
| 50 |
| 60 |
+------+
3 rows in set (0.00 sec)
3. IF ELSE를 사용한 조건부 저장 프로시저 작성
이제 매개변수 값이 40 이상이면 DemoTable2를 조회하고, 그렇지 않으면 DemoTable1을 조회하는 저장 프로시저를 생성합니다.
mysql> DELIMITER //
mysql> CREATE PROCEDURE Conditional_Query(id int)
BEGIN
IF id >=40 THEN
Select * from DemoTable2;
ELSE
Select * from DemoTable1;
END IF;
END
//
Query OK, 0 rows affected (0.21 sec)
mysql> DELIMITER ;
참고: 저장 프로시저 본문 내부의 세미콜론(;)이 일반 SQL 문의 종결자와 충돌하지 않도록, 프로시저 생성 전에 DELIMITER //로 구분 기호를 변경하고, 생성이 끝나면 DELIMITER ;로 원래대로 되돌려 주는 것이 좋습니다.
4. 저장 프로시저 호출 및 결과 확인
CALL 명령으로 저장 프로시저를 실행할 수 있습니다. 먼저 40 이상인 값 100을 전달해 보겠습니다.
mysql> call Conditional_Query(100);
조건이 참이므로 DemoTable2의 데이터가 반환됩니다.
+------+
| Id |
+------+
| 40 |
| 50 |
| 60 |
+------+
3 rows in set (0.00 sec)
Query OK, 0 rows affected (0.03 sec)
이번에는 40 미만인 값 13을 전달해 보겠습니다.
mysql> call Conditional_Query(13);
조건이 거짓이므로 이번에는 DemoTable1의 데이터가 출력됩니다.
+------+
| Id |
+------+
| 10 |
| 20 |
| 30 |
+------+
3 rows in set (0.00 sec)
Query OK, 0 rows affected (0.02 sec)
정리
이처럼 MySQL 저장 프로시저에서는 IF ELSE 문을 사용해 입력값에 따라 분기 처리된 쿼리를 간단하게 구현할 수 있습니다. 조건이 세 가지 이상으로 늘어난다면 ELSEIF를 추가하거나 CASE 문을 활용하는 것도 좋은 대안입니다. 반복적으로 사용되는 조건부 조회 로직은 저장 프로시저로 묶어두면 코드 재사용성과 유지보수성이 크게 향상됩니다.