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를 가동할 수 있다.
'인포테인먼트 - development > sql' 카테고리의 다른 글
[mysql] mysql과 excel 연동하기 : mysql for excel (2) | 2020.04.26 |
---|---|
[mysql] INSERT - 중복되는 데이터는 넣지 않기 (2) | 2020.04.24 |
[MySQL] trigger란 (0) | 2020.04.15 |
[MySQL] MySQL 프로파일링 - 쿼리문 성능 비교 (0) | 2020.04.10 |
[MySQL] Can't connect to local MySQL server through socket '/tmp/mysql.sock' 에러 해결 (0) | 2020.04.08 |
댓글