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

MySQL 저장 프로시저에서 WHERE IN() 절 사용하는 방법

MySQL 저장 프로시저에서 WHERE IN() 절 사용하기

MySQL에서 저장 프로시저(Stored Procedure) 내부에 WHERE IN() 조건을 적용하려면 일반적인 방식으로는 동작하지 않습니다. IN() 절에 전달되는 값 목록이 단순 문자열로 처리되기 때문입니다. 따라서 동적 SQL과 PREPARE 문을 함께 활용해야 합니다.

아래 예제를 통해 단계별로 살펴보겠습니다.

1단계: 테이블 생성

먼저 테이블을 생성합니다.

mysql> create table DemoTable
-> (
-> Id int,
-> Name varchar(20)
-> );
Query OK, 0 rows affected (0.69 sec)

2단계: 레코드 삽입

INSERT 명령어를 사용해 테이블에 데이터를 입력합니다.

mysql> insert into DemoTable values(100,'Chris');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values(101,'Bob');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values(102,'David');
Query OK, 1 row affected (0.18 sec)

3단계: 전체 레코드 조회

SELECT 문으로 테이블의 모든 레코드를 확인합니다.

mysql> select * from DemoTable;

실행 결과는 다음과 같습니다.

+------+-------+
| Id | Name |
+------+-------+
| 100 | Chris |
| 101 | Bob |
| 102 | David |
+------+-------+
3 rows in set (0.00 sec)

4단계: WHERE IN()을 사용하는 저장 프로시저 생성

다음은 WHERE IN() 조건을 포함한 저장 프로시저를 생성하는 쿼리입니다.

mysql> DELIMITER //
mysql> CREATE PROCEDURE whereInDemo(in input varchar(100))
-> BEGIN
-> set @Query = 'select Name from DemoTable ';
-> set @Query = CONCAT(@Query,' where Id IN (',`input`,')');
-> prepare stmt from @Query;
-> execute stmt;
-> deallocate prepare stmt;
-> END //
Query OK, 0 rows affected (0.23 sec)
mysql> DELIMITER ;

핵심 포인트: CONCAT 함수로 쿼리 문자열을 동적으로 조합한 뒤, PREPARE로 문장을 준비하고 EXECUTE로 실행합니다. 마지막에는 DEALLOCATE PREPARE로 할당된 리소스를 해제하여 메모리 낭비를 방지하는 것이 좋습니다.

5단계: 저장 프로시저 호출

CALL 명령어로 저장 프로시저를 호출할 수 있습니다.

mysql> call whereInDemo('100,102');

실행 결과는 다음과 같습니다.

+-------+
| Name |
+-------+
| Chris |
| David |
+-------+
2 rows in set (0.04 sec)
Query OK, 0 rows affected, 1 warning (0.07 sec)

결과에서 확인할 수 있듯이, Id가 100과 102인 두 개의 레코드만 정상적으로 반환되었습니다. 이처럼 동적 SQL 방식을 활용하면 저장 프로시저 안에서도 WHERE IN() 절을 자유롭게 사용할 수 있습니다.