MySQL 저장 프로시저에 배열 전달하기
MySQL은 다른 프로그래밍 언어와 달리 배열(Array) 타입을 기본적으로 지원하지 않습니다. 하지만 콤마로 구분된 문자열과 FIND_IN_SET() 함수를 활용하면 배열과 유사한 방식으로 여러 값을 저장 프로시저(Stored Procedure)에 전달할 수 있습니다. 이번 글에서는 실제 예제를 통해 그 방법을 단계별로 알아보겠습니다.
1단계: 예제용 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다.
mysql> create table FindDemo
-> (
-> name varchar(100)
-> );
Query OK, 0 rows affected (0.46 sec)
2단계: 테이블에 데이터 삽입
생성한 테이블에 테스트용 레코드를 삽입합니다.
mysql> insert into FindDemo values('John'),('Smith');
Query OK, 2 rows affected (0.13 sec)
Records: 2 Duplicates: 0 Warnings: 03단계: 전체 레코드 확인
데이터가 정상적으로 입력되었는지 전체 레코드를 조회해 확인합니다.
mysql> select * from FindDemo;
실행 결과는 다음과 같습니다.
+-------+
| name |
+-------+
| John |
| Smith |
+-------+
2 rows in set (0.00 sec)
4단계: 배열을 매개변수로 받는 저장 프로시저 생성
이제 콤마로 구분된 문자열을 배열처럼 받아 처리하는 저장 프로시저를 생성합니다. 핵심은 FIND_IN_SET() 함수로, 이 함수는 첫 번째 인수가 두 번째 인수(콤마 구분 문자열) 내에 존재하는지 확인하여 일치하는 행만 조회합니다.
mysql> delimiter //
mysql> CREATE PROCEDURE SearchingStoredProcedure(IN ArrayDemo VARCHAR(100))
-> BEGIN
-> SELECT * FROM FindDemo
-> WHERE FIND_IN_SET(name, ArrayDemo);
->
-> END//
Query OK, 0 rows affected (0.14 sec)
delimiter //는 프로시저 내부의 세미콜론(;)이 문장 종료로 해석되지 않도록 구분 기호를 임시로 변경하는 명령입니다. 프로시저 생성 후에는 delimiter ;로 원래대로 되돌려야 합니다.
5단계: 프로시저 호출 및 결과 확인
이제 콤마로 구분된 값 목록을 배열처럼 전달하여 프로시저를 호출해 보겠습니다.
mysql> delimiter ;
mysql> call SearchingStoredProcedure('David,Bob,John');
실행 결과는 다음과 같습니다.
+------+
| name |
+------+
| John |
+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
결과 분석
전달한 값 목록 'David,Bob,John' 중 테이블에 실제로 존재하는 값은 'John'뿐이므로, 해당 레코드 하나만 조회되었습니다. 이처럼 FIND_IN_SET()을 활용하면 MySQL에서 배열을 전달하는 것과 동일한 효과를 얻을 수 있습니다.
마무리 및 참고 사항
MySQL에서 배열을 저장 프로시저에 전달하는 가장 간단한 방법은 콤마 구분 문자열과 FIND_IN_SET() 함수를 조합하는 것입니다. 다만 이 방식은 다음과 같은 한계도 있으니 참고하세요.
· 성능: FIND_IN_SET()은 인덱스를 활용할 수 없어 대용량 데이터에서는 속도가 느려질 수 있습니다.
· 데이터 무결성: 콤마 구분 문자열은 정규화(Normalization) 관점에서 권장되지 않습니다.
· 대안: 값의 개수가 많다면 JSON 타입(MySQL 5.7 이상)이나 임시 테이블을 활용하는 방법도 고려해 볼 수 있습니다.
소규모 조회 조건을 동적으로 처리할 때는 이번 예제처럼 간결하게 활용하기 좋으므로, 상황에 맞게 적절히 사용하시기 바랍니다.