Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 프로시저와 함수의 핵심 차이점 완벽 정리

MySQL에서 프로시저(Procedure)함수(Function)의 가장 중요한 차이점은 호출 방식과 사용 목적이 다르다는 점입니다. 이 외에도 두 객체 사이에는 여러 가지 구조적·문법적 차이가 존재합니다. 아래에서 하나씩 자세히 살펴보겠습니다.

1. 반환 값과 호출 방식의 차이

프로시저는 값을 반환하지 않습니다. 대신 CALL 문을 통해 호출되며, 테이블을 수정하거나 조회된 레코드를 처리하는 등 특정 작업을 수행하는 것이 주된 목적입니다.

반면 함수는 표현식(expression) 내부에서 호출되며, 단일 값을 직접 반환하여 그 표현식에 활용됩니다. 즉, 함수는 상수나 내장 함수(built-in function), 테이블 컬럼 참조와 동일한 방식으로 SQL 표현식 안에서 사용됩니다.

2. 호출 제약 조건

  • 함수는 CALL 문으로 호출할 수 없습니다.
  • 프로시저는 표현식 내부에서 호출할 수 없습니다.

이러한 제약 때문에 두 객체는 서로 완전히 다른 용도로 구분되어 사용됩니다.

3. 생성 문법(Syntax)의 차이

프로시저와 함수는 생성 시 사용하는 문법도 일부 다릅니다. 공식 문법은 다음과 같습니다.

CREATE
    [DEFINER = { user | CURRENT_USER }]
    PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body

CREATE
    [DEFINER = { user | CURRENT_USER }]
    FUNCTION sp_name ([func_parameter[,...]])
    RETURNS type
    [characteristic ...] routine_body

proc_parameter:
    [ IN | OUT | INOUT ] param_name type

func_parameter:
    param_name type

type:
    유효한 MySQL 데이터 타입

characteristic:
    COMMENT 'string'
    | LANGUAGE SQL
    | [NOT] DETERMINISTIC
    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    | SQL SECURITY { DEFINER | INVOKER }

routine_body:
    유효한 SQL 루틴 문장

4. 파라미터(Parameter) 처리 방식의 차이

프로시저의 파라미터는 입력 전용(IN), 출력 전용(OUT), 입출력 겸용(INOUT) 세 가지 모드로 정의할 수 있습니다. 덕분에 프로시저는 출력 파라미터를 통해 호출자에게 값을 전달할 수 있으며, CALL 문 이후의 문장에서 해당 값들에 접근할 수 있습니다.

반면 함수는 입력 파라미터만 가질 수 있습니다. 따라서 프로시저와 함수 모두 파라미터를 가질 수 있지만, 파라미터 선언 문법 자체가 서로 다릅니다.

5. RETURNS 절과 RETURN 문의 유무

함수는 반드시 값을 반환하기 때문에, 함수 정의에는 반환값의 데이터 타입을 명시하는 RETURNS 절이 필수입니다. 또한 함수 본문 내부에는 호출자에게 값을 돌려주기 위한 RETURN 문이 최소 한 개 이상 존재해야 합니다.

반면 프로시저 정의에는 RETURNS 절과 RETURN 문이 나타나지 않습니다.

정리

구분프로시저(Procedure)함수(Function)
호출 방식CALL 문표현식 내부
반환 값없음 (OUT/INOUT 파라미터로 전달)단일 값 반환 필수
파라미터 모드IN / OUT / INOUTIN만 가능
RETURNS 절불필요필수
RETURN 문불필요본문에 최소 1개 필요

결론적으로, 작업 수행 중심이라면 프로시저를, 계산 결과를 표현식에서 활용해야 한다면 함수를 선택하는 것이 MySQL 루틴 설계의 기본 원칙입니다.