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 변수명 타입 기본값]의 형태로 선언합니다.이렇게 정의된 프로시저는 CALL을 통해 호출하여 사용합니다.
CALL 프로시저명(파라미터);
현재 포스트가
프로시저관련 내용이라 프로시저 위주로 설명할 뿐이지, 다음 포스트에서 다룰 예정인트리거와 함수에서도 제어문을 이용할 수 있으므로 프로시저에서만 사용가능한 것이 아니라는 것에 주의해주세요.
프로시저 내에서 제어문을 이용하여 다양한 코드의 흐름을 작성할 수 있습니다.
MySQL에서 제공하는 제어문에는 다음과 같은 것들이 있습니다.
| 제어문 | 설명 | 사용 구문 |
|---|---|---|
| DELIMITER | 구분자 변경 | DELIMITER 기호 |
| BEGIN-END | 프로그램 블록화. 중첩 허용 | BEGIN {SQL} END |
| IF-ELSE | 조건 분기. ELSE는 선택사항 | IF 조건식 THEN {SQL} ELSE {SQL} END IF; |
| LOOP | LEAVE를 만나기 전까지 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등의 결과를 말이죠.