스토어드(저장) 프로시저는 여러 쿼리문의 집합을 하나로 묶어 마치 함수/모듈처럼 사용하는 기능이다.
스토어드 프로시저를 사용하여 조건문, 반복문, 변수 선언 등의 조합을 통해 복잡한 비즈니스 로직을 처리할 수 있다.
MySQL에서는 프로시저를 직접 수정할 수 없기 때문에 삭제 후 재생성하는 방식으로 수정한다.
MySQL에서는 기본적으로 반환값이 없기 때문에 RETURN 명령을 사용할 수 없고, 대신 [IN / OUT / INOUT]과 같은 매개변수 타입을 통해 [입력 / 출력 / 입·출력용] 데이터를 처리한다.
생성된 프로시저는 CALL명령어를 통해 호출할 수 있다.
CALL <프로시저명>();
SHOW CREATE PROCEDURE <프로시저명>;
DROP PROCEDURE <프로시저명>;
DELIMITER $$ CREATE PROCEDURE <프로시저명> (<파라미터명>, ...) BEGIN 비즈니스 로직 작성... END $$ DELIMITER;MySQL에서는 기본적으로 세미콜론(;)을 명령문 종료 구분자로 사용하지만, 프로시저나 함수처럼 내부에 여러 SQL 문장을 포함해야 하는 경우 명령문 종료를 명확히 구분하기 위해
DELIMITER를 사용해 구분자를 임시로 변경하고, 작성이 끝난 후 다시 기본 구분자인 세미콜론으로 복원한다.
(구분자는 여러 문자로 생성할 수 있다. $$, && 등...)DELIMITER $$ -- 세미콜론(;) -> 달러($) DELIMITER; -- 달러($) -> 세미콜론(;)
MySQL 프로시저에서는 DECLARE명령어로 변수를 선언하고, SET명령어로 값을 할당한다.
... BEGIN DECLARE <변수명> <데이터 타입>; -- 변수 선언 SET <변수명> = <값>; -- 변수에 값 할당 END $$ ...
프로시저 외부에서 변수를 선언할 때는 아래와 같은 방법으로 선언한다.
-- @<변수명> : 세션 변수로 사용자가 접속한 DB내에서 전역처럼 사용할 수 있는 변수다. (다른 사용자는 사용X) SET @<변수명> = <할당값>; -- 변수값 확인 SELECT @<변수명>
프로시저에서 IF문의 기본 틀은 아래와 같다.
IF <조건식1> THEN <로직1> ELSEIF <조건식2> THEN <로직2> ELSEIF <조건식3> THEN <로직3> ELSE <로직4> END IF;-- 활용 예시 DELIMITER $$ CREATE PROCEDURE num_check( IN var1 INT , OUT var2 VARCHAR(50) ) BEGIN IF var1 < 0 THEN SET var2 = '음수입니다.'; ELSEIF var1 > 0 THEN SET var2 = '양수입니다.'; ELSE SET var2 = '0입니다.'; END IF; END $$ DELIMITER;
MySQL에서 반복문은 3가지 종류가 있으며, 각각 동작하는 방식이 조금씩 다르다.
또한, MySQL에서 반복문 탈출은 LEAVE명령어를 사용하여 반복문을 강제로 빠져나올 수 있다.
(반복문 이름을 명시적으로 지정한 후 해당 이름을 통해 탈출할 수 있다.)
WHILE문은 지정한 조건에 따라 동작되는 반복문이다.
WHILE문 기본 구조
WHILE (<조건식>) DO 로직... END WHILE;-- 명시적으로 해당 반복문 탈출 <반복문명>: WHILE (<조건식>) DO 로직... IF(<특정 조건>) THEN LEAVE <반복문명>; END IF; END WHILE;
REPEAT문은 최초 1회 로직 동작 후 지정한 조건에 따라 동작되는 반복문이다.
REPEAT문 기본 구조
<반복문명>: REPEAT 로직... IF(<특정 조건>) THEN LEAVE <반복문명>; END IF; UNTIL <조건식> END REPEAT;
LOOP문은 특정 조건식을 통해 반복 횟수를 지정하는 반복문이다.
<반복문명>: LOOP 로직... IF(<특정 조건>) THEN LEAVE <반복문명>; END IF; END LOOP;
프로시저 내부에서 특정 쿼리의 결과 집합을 하나씩(1개 ROW) 가져와서 처리하는 기능이다.
커서 기본 구조
... BEGIN -- 커서 반복문 종료를 위한 변수 선언 DECLARE <커서 종료 변수> BOOLEAN DEFAULT FALSE; -- 커서 생성 DECLARE <커서명> CURSOR FOR <SELECT 쿼리문>; -- 커서 종료 조건 설정 -- 커서의 데이터 ROW가 마지막에 접근하면 커서 종료 변수가 TRUE로 변환 DECLARE CONTINUE HANDLER FOR NOT FOUND SET <커서 종료 변수> = TRUE; -- 커서 열기 OPEN <커서명>; -- 커서 데이터 반복문 <반복명>: LOOP FETCH <커서명> INTO <커서 데이터 컬럼>; -- 더이상의 커서 데이터가 없으면 반복 탈출 IF <커서 종료 변수> = TRUE THEN LEAVE <반복명>; END IF; 로직... END LOOP <반복명>; -- 커서 닫기 CLOSE <커서명>; END $$ ...
스토어드(저장) 함수는RETURN문을 통해 하나의 값만을 반환받을 수 있다.
(스토어드 프로시저는 여러 데이터를 반환받을 수 있음)
호출 방식은 SELECT문으로 호출 가능하며, IN매개변수만을 사용한다.
스토어드 함수 기본 구조
DELIMITER $$ CREATE FUNCTION <함수명> (<파라미터명>, ...) RETURNS <반환 데이터 타입> BEGIN 로직... RETURN <반환 데이터>; END $$ DELIMITER ;