프로시저; Procedure
일련의 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합
Stored Procedure라고도 불린다.
MySQL의 경우, 5.0 이후 표준 규격 지원
장점
- 하나의 요청으로 여러 SQL 실행 가능 → 네트워크 부하 ⬇️
- 응용 프로그램 로직 없이 데이터베이스의 참조 무결성 유지 가능
- 처리 시간 ⬇️, 보수성 ⬆️
- 쿼리문 보호, SQL Injection 보호, 권한 제어(특정 프로시저에만 접근 가능한 권한 부여)
- 일괄 작업에 유용, 절차적 기능 및 동적 쿼리 가능
단점
- 재사용성 ⬇️, 디버깅 및 유지보수에 어려움
형식
실질적으로 프로시저를 정의하는 부분은 create부터 end까지의 부분이다.
DROP PROCEDURE IF EXISTS procedure_name; -- 이미 프로시저가 정의되어 있다면 삭제
DELIMITER // --//대신 다른 문자로 대체 가능
CREATE PROCEDURE procedure_name
([
[ IN | OUT ] parameter_name { parameter_type | ARRAY OF parameter_type }, ...
]) -- 매개변수
[ DECLARE variable_declaration;...[;] ] -- 프로시저 내부에서 사용하는 변수 선언
BEGIN procedure_body_statement;...[;]
END //
DELIMITER ;
- DELIMITER '문자'
문법의 끝을 나타내는 구문 문자를 정의한다.
프로시저 내의 세미콜론(;)으로 인해 문장 구분이 어렵기 때문에 사용한다.
기존의 구문 문자인 세미콜론을 만나도 쿼리가 실행되지 않게끔 한다. - SET
변수에 값 변경 또는 대입
매개변수
- IN : 매개변수 전달. 테이블 이름을 매개변수로 전달받을 수는 없다.
- OUT : 호출한 프로그램에 전달
- INOUT : IN과 OUT 변수 결합. 호출 프로그램이 인수를 전달하고, 프로시저가 수정 후에 호출한 프로그램에 값을 전달한다.
조건문
-- IF문
IF
THEN
ELSEIF
THEN
END IF;
-- CASE문
CASE [조건대상]
WHEN [조건값] THEN
ELSE
END CASE;
반복문
WHILE [조건] DO
END WHILE;
실행 방법
CALL 프로시저 이름(매개변수);
실행 시, 순서는 아래와 같다.
프로시저 호출 → DB Catalog에서 이름을 찾음 → 프로시저 코드 컴파일 → 메모리 영역에 캐시로 저장 → 프로시저 실행
동일한 session에서 같은 프로시저 재호출 시, 기존에 있는 캐시로 실행된다.
728x90