DB 안에 저장해서 쓰는 코드들은 전부 비슷해 보이지만, 언제 실행되느냐 / 어떻게 호출되느냐 / 무엇을 반환하느냐에 따라 역할이 꽤 다르다.
여기서는 Function, Procedure, Trigger 세 가지를 한 번에 정리한다.
Function은 입력 값을 받아서 하나의 값을 반환하는 DB 내부 함수다.
SQL 식(expression) 안에서 일반 함수처럼 호출하는 것을 전제로 한다.
예)
SELECT
user_id,
calc_score(user_id) AS score
FROM users;
Procedure는 여러 SQL과 제어문을 묶어서 하나의 작업 단위(트랜잭션)로 실행하는 코드 덩어리다.
애플리케이션이 CALL / EXEC 같은 방식으로 명시적으로 호출한다.
일반적인 구조는 다음과 같다.
DECLARE : 프로시저 이름, 변수, 파라미터, 데이터 타입 선언 BEGIN / END : 본문 시작/종료 CONTROL : IF, LOOP, CASE 등 제어문 SQL : DML(DATE 삽입/수정/삭제), 필요 시 DDL/DCL 일부 EXCEPTION : 예외 처리 TRANSACTION : COMMIT / ROLLBACK 등 트랜잭션 경계 처리예시 형식:
CREATE OR REPLACE PROCEDURE close_daily_batch(p_target_date DATE)
IS
BEGIN
-- 본문: 집계, 로그 적재, 상태 변경 등
COMMIT;
END;
호출:
EXEC close_daily_batch(SYSDATE - 1);
-- 또는
CALL close_daily_batch(CURRENT_DATE - 1);
Trigger는 특정 테이블/뷰에서 이벤트가 발생할 때 자동으로 실행되는 코드다.
애플리케이션이 직접 호출하지 않고, DB가 “조건이 만족되면 알아서” 실행한다.
일반적인 구조는 다음과 같다.
DECLARE : 변수, 커서 등 선언 EVENT : 언제 실행할지 지정 BEGIN / END : 본문 CONTROL : IF, LOOP 등 SQL : 주로 DML (DCL은 대부분 DB에서 허용되지 않음) EXCEPTION : 예외 처리예시 형식:
CREATE OR REPLACE TRIGGER user_audit_trg
AFTER UPDATE ON users
FOR EACH ROW
BEGIN
INSERT INTO user_audit(user_id, old_status, new_status, changed_at)
VALUES (:OLD.id, :OLD.status, :NEW.status, CURRENT_TIMESTAMP);
END;
| 구분 | 호출 방식 | 반환값 | 주요 역할 |
|---|---|---|---|
| Function | SELECT/WHERE 등 SQL 식 안에서 호출 | 반드시 1개의 값 반환 | 계산/변환/포맷팅, 규칙 기반 값 도출 |
| Procedure | CALL / EXEC 등으로 명시적 호출 | 없어도 되고 OUT 파라미터 사용 | 배치/마감/집계 등 “작업 한 덩어리” 실행 |
| Trigger | 이벤트 발생 시 DB가 자동 실행 | 직접 반환 개념 없음 | 테이블 변경 시 후속 작업, 감사·무결성 처리 |
한 줄로 요약하면,