본문 바로가기
  • 포르쉐타고싶다
인포테인먼트 - development/sql

[mysql] procedure의 인자로 배열 전달 : FIND_IN_SET

by 지오ㄴl 2020. 4. 24.

1. 배경

 

데이터베이스와 통신을 하면서

복잡한 쿼리문은 procedure을 이용해서 보다 효율적인 네트워킹할 수 있다.

 

프로시저에는 인자를 담을 수 있어

같은 내용의 프로시저에 변수만 다른 경우 

상황에 맞게 프로시저를 함수같이 사용할 수 있다.

 

하지만 일반적인 함수와 다르게 프로시저는

배열을 인자로 전달받지 못한다.

 

반대로 프로시저를 사용해야 하는 대표적인 경우 중 하나가 반복문, loop이다.

다른 테이블 자체에서 loop를 돌리는 경우는 별다른 배열인자가 필요하지 않지만

유저가 무언가를 선택한 것에 대해서 그 배열을 가지고 loop를 돌리는 프로시저를 구현해야 한다면

프로시저의 인자로 배열을 넣어주어야 하는 상황이 종종 발생한다.

 

그렇다면 프로시저의 인자로 배열을 어떻게 넣어줄 수 있을까

 

바로 FIND_IN_SET을 이용하는 것이다.

 

구현 방법 다음과 같다


2. 구현 절차

1) 서버에서 배열을 String꼴로 바꾼다.
2) 쿼리문안에서 그 String값을 프로시저 인자값으로 넘겨준다.
3) 프로시저안에서 그 String값을 배열로 다시 바꿔 이용한다.

 

3. 구현 방법

 

1) 서버에서 배열을 String꼴로 바꾼다.

배열은 String으로 바꿀 수 있다.

var arr = [3, 4];
var arrString = arr.join(',');
console.log(arrString);			//3,4
console.log(typeof arrString);		//String

 

저렇게 얻은 배열 string값을 프로시저의 인자로 넣어준다.

CALL ArrayProcedure(arrString);

 

2) 쿼리문안에서 그 String값을 프로시저 인자값으로 넘겨준다

이제 프로시저 ArrayProcedure가 어떻게 생겼는지 보자

drop procedure if exists ArrayProcedure;
delimiter $$
create procedure ArrayProcedure(IN p_arr_input VARCHAR(45)) // 배열을 string으로 받는다
begin
	DECLARE done INTEGER DEFAULT 0;
	DECLARE v_value INT(11);
    
	DEClARE openCursor CURSOR FOR select column1 from table1 where FIND_IN_SET(column1, p_arr_input); //string을 해당 컬럼에서의 배열화
 
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;
    
    open openCursor;
 
		hi_loop: LOOP
        
        ....

 

주목해야할 두 문장이 있다.

바로 3번째 줄과 7번째줄

 

(1) 3번째 줄 : create procedure ArrayProcedure(IN p_arr_input VARCHAR(45))

 

 - 주석에 써져있는대로 배열을 string화 해서 인자로 받고있다.

 - [2, 3]의 배열을 보내려고 한다면 string화 된 값은 '2,3'으로 되어있을 것이다.

 - ***이때! 배열을 string화할 때,

        1)에서 배열에 join을 사용한다면 자동으로 되겠지만, '2, 3' 이렇게 콤마뒤에가 띄어쓰기 되어있으면 안된다!

 

 

3) 프로시저안에서 그 String값을 배열로 다시 바꿔 이용한다.

(2) 7번째 줄 : DECLARE openCursor CURSOR FOR select column1 from table1 where FIND_IN_SET(column1, p_arr_input);

 - 바로 string으로 바뀌어있던 것을 다시 배열로 바꾸는 것이다.
 - 이 때, 바뀐 모습은 그냥 배열이 아니라 FIND_IN_SET의 첫번째 값(column1)의
   열에 대한 select 모습으로 나타나게 된다.
 - 위의 구문에 의해서 커서는 곧바로 우리가 원하는 배열위에 그려져
  해당 열에 대한, 원하는 배열에 대해 loop를 가동할 수 있다.

 

 

 

 

반응형

댓글