Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 IF 문과 WHILE 루프를 함께 구현하는 방법 – 저장 프로시저 완벽 가이드

MySQL에서 IF 문으로 WHILE 루프 구현하기

MySQL에서는 저장 프로시저(Stored Procedure) 안에서 WHILE 루프IF 문을 조합하여 반복 처리 로직을 손쉽게 구현할 수 있습니다. 이번 글에서는 현재 달의 모든 날짜를 하루씩 검사하면서 주말을 제외한 평일(월요일~금요일)의 개수를 계산하는 실전 예제를 통해 그 방법을 단계별로 살펴보겠습니다.

1. 저장 프로시저 생성하기

아래는 WHILE 루프와 IF 문을 함께 사용하는 저장 프로시저를 생성하는 쿼리입니다:

mysql> DELIMITER //
mysql> create procedure sp_getDaysDemo()
   -> BEGIN
   -> SELECT MONTH(CURDATE()) INTO @current_month;
   -> SELECT MONTHNAME(CURDATE()) INTO @current_monthname;
   -> SELECT DAY(LAST_DAY(CURDATE())) INTO @total_numberofdays;
   -> SELECT CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE)INTO @check_weekday;
   -> SELECT DAY(@check_weekday) INTO @check_day;
   -> SET @count_days = 0;
   -> SET @workdays = 0;
   ->
   -> WHILE(@count_days < @total_numberofdays) DO
   -> IF (WEEKDAY(@check_weekday) < 5) THEN
   -> SET @workdays = @workdays+1;
   -> END IF;
   -> SET @count_days = @count_days+1;
   -> SELECT ADDDATE(@check_weekday, INTERVAL 1 DAY) INTO @check_weekday;
   -> END WHILE;  
   ->
   -> select @current_month,@current_monthname,@total_numberofdays,@check_weekday,@check_day;
   -> END
   ->
   -> //
Query OK, 0 rows affected (0.24 sec)
mysql> delimiter ;

2. 프로시저 동작 원리

  • @current_month, @current_monthname: CURDATE() 함수로 현재 월의 숫자 값과 이름을 각각 저장합니다.
  • @total_numberofdays: LAST_DAY() 함수를 활용해 해당 월의 총 일수를 구합니다.
  • @check_weekday: 검사 대상 날짜로, 매월 1일부터 시작하여 하루씩 증가합니다.
  • WHILE 루프: 검사한 일수(@count_days)가 총 일수에 도달할 때까지 반복 실행됩니다.
  • IF 문: WEEKDAY() 함수의 반환값이 5 미만이면(즉, 월요일~금요일) 평일 카운터인 @workdays를 1 증가시킵니다.

3. 저장 프로시저 호출하기

생성된 저장 프로시저는 CALL 명령어로 호출할 수 있으며, 기본 문법은 다음과 같습니다:

CALL yourStoredProcedureName();

위에서 만든 프로시저는 다음 쿼리로 호출합니다:

mysql> call sp_getDaysDemo();

4. 실행 결과 확인

+----------------+--------------------+---------------------+----------------+------------+
| @current_month | @current_monthname | @total_numberofdays | @check_weekday | @check_day |
+----------------+--------------------+---------------------+----------------+------------+
|              1 | January            | 31                  | 2019-02-01     |          1 |
+----------------+--------------------+---------------------+----------------+------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.02 sec)

실행 결과를 보면 현재 월 숫자(1), 월 이름(January), 해당 월의 총 일수(31일), 마지막으로 검사한 날짜 등이 정상적으로 출력되는 것을 확인할 수 있습니다. 이처럼 WHILE 루프와 IF 문을 조합하면 날짜 기반의 복잡한 반복 계산도 저장 프로시저 하나로 깔끔하게 처리할 수 있습니다.