[MySQL] Stored Procedure

코린이·2025년 6월 15일

MySQL

목록 보기
20/23

✅ Stored Procedure

스토어드(저장) 프로시저는 여러 쿼리문의 집합을 하나로 묶어 마치 함수/모듈처럼 사용하는 기능이다.

스토어드 프로시저를 사용하여 조건문, 반복문, 변수 선언 등의 조합을 통해 복잡한 비즈니스 로직을 처리할 수 있다.

📌 프로시저 주의사항

  • MySQL에서는 프로시저를 직접 수정할 수 없기 때문에 삭제 후 재생성하는 방식으로 수정한다.

  • MySQL에서는 기본적으로 반환값이 없기 때문에 RETURN 명령을 사용할 수 없고, 대신 [IN / OUT / INOUT]과 같은 매개변수 타입을 통해 [입력 / 출력 / 입·출력용] 데이터를 처리한다.

    • 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문의 기본 틀은 아래와 같다.

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;

📌 반복문 WHILE / REPEAT / LOOP

MySQL에서 반복문은 3가지 종류가 있으며, 각각 동작하는 방식이 조금씩 다르다.

또한, MySQL에서 반복문 탈출은 LEAVE명령어를 사용하여 반복문을 강제로 빠져나올 수 있다.
(반복문 이름을 명시적으로 지정한 후 해당 이름을 통해 탈출할 수 있다.)

▶︎ WHILE

WHILE문은 지정한 조건에 따라 동작되는 반복문이다.

WHILE문 기본 구조

WHILE (<조건식>) DO
	로직...
END WHILE;
-- 명시적으로 해당 반복문 탈출
<반복문명>: WHILE (<조건식>) DO
	로직...

    IF(<특정 조건>) THEN LEAVE <반복문명>;
    END IF;

END WHILE;

▶︎ REPEAT

REPEAT문은 최초 1회 로직 동작 후 지정한 조건에 따라 동작되는 반복문이다.

REPEAT문 기본 구조

<반복문명>: REPEAT
	로직...

    IF(<특정 조건>) THEN LEAVE <반복문명>;
    END IF;

	UNTIL <조건식>
END REPEAT;

▶︎ LOOP

LOOP문은 특정 조건식을 통해 반복 횟수를 지정하는 반복문이다.

<반복문명>: LOOP
	로직...

    IF(<특정 조건>) THEN LEAVE <반복문명>;
    END IF;

END LOOP;

📌 CURSOR(커서)

프로시저 내부에서 특정 쿼리의 결과 집합을 하나씩(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 $$
...

✅ Stored Function

스토어드(저장) 함수는RETURN문을 통해 하나의 값만을 반환받을 수 있다.
(스토어드 프로시저는 여러 데이터를 반환받을 수 있음)

호출 방식은 SELECT문으로 호출 가능하며, IN매개변수만을 사용한다.

스토어드 함수 기본 구조

DELIMITER $$
CREATE FUNCTION <함수명> (<파라미터명>, ...)
	RETURNS <반환 데이터 타입>
BEGIN
	로직...
    RETURN <반환 데이터>;
END $$
DELIMITER ;   

0개의 댓글