[MySQL] 프로시저

Bam·2025년 5월 1일
0

Database

목록 보기
26/39
post-thumbnail

프로시저

MySQL에서 프로시저 Procedure는 SQL, 제어 흐름 로직을 저장해놨다가 필요한 시점에 호출해서 사용할 수 있도록 만드는 저장 프로그램입니다.

그래서 SQL 조작 과정에서 반복되는 제어 흐름이 있다면 해당 흐름을 프로시저로 만들어서 반복되는 제어 작업을 줄일 수 있습니다.

또한 하나의 트랜잭션으로 처리되기 때문에 여러 테이블에 데이터 조작을 수행하는 경우에도 이들을 하나의 트랜잭션으로 묶어서 수행할 수 있게 됩니다.


프로시저 정의

프로시저는 다음과 같이 정의합니다.

DELIMITER $$

CREATE PROCEDURE 프로시저명 (파라미터, ...)
BEGIN
	#프로시저 본문
    DECLARE 변수명 타입
    
END $$

DELIMITER ;
  • DELIMITER는 구분자를 설정하는 명령입니다. 기본 구분자는 ;입니다.
    프로시저 내부에서 ;을 쓰는경우 END 뒤에 오는 구분자와 구분이 어렵기 때문에 구분자를 변경합니다. 프로시저가 종료되었다면 다시 ;로 변경해주어 이후의 작업에서 혼선을 방지합니다.

프로시저 생성은 CREATE PROCEDURE를 사용해서 생성합니다.

  • 파라미터는 저장된 프로시저가 호출될 때 프로시저에서 사용할 수 있도록 전달하는 값 입니다. IN, OUT, INOUT 세 가지 파라미터 종류가 있습니다.

    [IN 파라미터명 타입]과 같은 형식으로 선언합니다.

    • IN: 입력 전용 파라미터
    • OUT: 출력 전용 파라미터
    • INOUT: 입출력 파라미터

이렇게 선언된 프로시저의 내용은 BEGIN-END 구문 사이에 적습니다.

  • 변수는 프로시저 내에서 사용하기 위한 변수 선언으로 DECLARE 명령으로 생성합니다.
    [DECLARE 변수명 타입 기본값]의 형태로 선언합니다.
  • 본문에 SQL 구문 또는 잠시 후에 소개할 제어 흐름을 넣음으로써 프로시저의 본문을 정의하게 됩니다.

이렇게 정의된 프로시저는 CALL을 통해 호출하여 사용합니다.

CALL 프로시저명(파라미터);

프로시저에서 사용가능한 기능

제어문

현재 포스트가 프로시저 관련 내용이라 프로시저 위주로 설명할 뿐이지, 다음 포스트에서 다룰 예정인 트리거와 함수에서도 제어문을 이용할 수 있으므로 프로시저에서만 사용가능한 것이 아니라는 것에 주의해주세요.

프로시저 내에서 제어문을 이용하여 다양한 코드의 흐름을 작성할 수 있습니다.

MySQL에서 제공하는 제어문에는 다음과 같은 것들이 있습니다.

제어문설명사용 구문
DELIMITER구분자 변경DELIMITER 기호
BEGIN-END프로그램 블록화. 중첩 허용BEGIN
{SQL}
END
IF-ELSE조건 분기. ELSE는 선택사항IF 조건식 THEN {SQL}
ELSE {SQL}
END IF;
LOOPLEAVE를 만나기 전까지 LOOP 블록 반복LOOP
{SQL} 또는 LEAVE
END LOOP
WHILE조건식이 참인 동안 WHILE 블록 반복WHILE 조건식 DO
{SQL} 또는 BREAK 또는 CONTINUE
END WHILE
REPEAT조건식이 참일 경우 REPEAT 블록 반복REPEAT
{SQL} 또는 BREAK 또는 CONTINUE
UNTIL 조건식
END REPEAT
RETURN프로시저 종료 & 상태값 반환RETURN 식

커서

SQL의 실행 결과가 여러개인 경우에는 행 하나씩 처리합니다. 이때 현재 처리하고자하는 행을 가리키며 한 행 씩 순서대로 처리할 수 있게 하는 것이 커서 Cursor입니다.

커서를 정의하고 사용하기 위한 키워드들은 다음과 같습니다.

커서 구문설명
CURSOR 커서이름 IS 커서_정의
DECLARE 커서이름 CURSOR FOR
커서 생성
OPEN 커서이름커서 사용 시작
FETCH 커서이름 INTO 변수커서가 가리키는 행 데이터 취득
CLOSE 커서이름커서 사용 종료

커서 생성 과정에서 커서 정의는 커서가 어떤 결과 테이블을 가리키게 할 지를 정의하는 공간입니다. 예를들면 SELECT name from students_table 등의 결과를 말이죠.

0개의 댓글