프로시저(Procedure)와 함수(Function)은 사용자 정의 루틴(User Defined Routine, UDR)이라고 불리며, SQL문을 반복적으로 실행하거나, 비즈니스 로직을 캡슐화할 때 사용된다.
둘 다 비슷하지만 용도, 반환값, 사용 방식에서 차이가 있다.
프로시저 (Stored procedure)
- 하나 이상의 SQL문을 미리 저장해 놓은 이름 있는 블록.
- 호출할 대마다 실행된다.
- 보통 데이터 변경(INSERT/UPDATE/DELETE) 또는 복잡한 비즈니스 로직 처리에 사용된다.
특징
| 항목 | 설명 |
|---|
| 반환값 | 있을 수도 있고 없을 수도 있음 (OUT 파라미터 사용) |
| 트랜잭션 | 내부에서 시작하거나 제어 가능 |
| 호출 방법 | CALL procedure_name(...) |
| 주 용도 | 데이터 처리, 로깅, 복합 작업, 배치 처리 등 |
예제
MySQL 기준 예제이다.
DELIMITER
CREATE PROCEDURE add_emp(
IN emp_name VARCHAR(50),
IN emp_age INT
)
BEGIN
INSERT INTO employee (name, age)
VALUES (emp_name, emp_age);
END
DELIMITER ;
CALL add_emp('홍길동', 30);
함수 (Function)
- 특정 작업을 수행하고 결과값을 반환하는 루틴.
- 일반적으로 SELECT 쿼리에서 사용된다.
특징
| 항목 | 설명 |
|---|
| 반환값 | 반드시 있어야 함 |
| 트랜잭션 | 트랜잭션 제어 불가능 (보통 읽기 전용) |
| 호출 방법 | SELECT function_name(...) |
| 주 용도 | 계산, 포맷 변환, 값 반환 등 |
예제
MySQL 기준 예제이다.
DELIMITER
CREATE FUNCTION get_full_name(
first_name VARCHAR(50),
last_name VARCHAR(50)
)
RETURNS VARCHAR(100)
DETERMINISTIC
BEGIN
RETURN CONCAT(last_name, ' ', first_name);
END
DELIMITER ;
SELECT get_full_name('기현', '김');
프로시저와 함수의 차이점
| 구분 | 프로시저 (Procedure) | 함수 (Function) |
|---|
| 반환값 | RETURN X (OUT/INOUT 파라미터로 반환) | RETURN 필수 |
| 호출 방식 | CALL | SELECT, WHERE, SET 등에서 사용 |
| 목적 | 복잡한 로직 처리, 데이터 변경 | 계산식, 변환, 하나의 값 반환 |
| 트랜잭션 | 시작/커밋 가능 | 트랜잭션 시작 불가 (읽기 위주) |
| 내부 SQL | DML (INSERT/UPDATE/DELETE) 가능 | 일반적으로 SELECT만 허용 |
각 상황 별 사용
| 상황 | 선택 |
|---|
| 반복적으로 실행해야 하는 작업이 있을 때 | 프로시저 |
| 복잡한 SELECT 계산이 있을 때 | 함수 |
| 여러 개의 작업을 순차적으로 처리해야 할 때 | 프로시저 |
| 쿼리에서 값을 계산해서 바로 써야 할 때 | 함수 |
다른 팁
- 프로시저는
IF, LOOP, CURSOR 등을 써서 복잡한 흐름을 만들 수 있다.
- 함수는 보통 순수 함수(Pure Function) 성격이 강하며, 입력 - 출력 구조이다.
- 일부 DBMS(Oracle, ProstgreSQL 등)에서는 함수 내에서 DML이 가능하지만 MySQL에서는 제한적이다.