본문 바로가기
DB

함수(FUNCTION), 프로시저(PROCEDURE), 트리거(TRIGGER)

by 도쿠니 2022. 5. 17.

함수, 프로시저, 트리거

함수

  • DBMS에서 제공되는 내장함수 외에 사용자가 직접 정의가능
  • SQL을 이용하여 로직을 수행하고, 결과를 단일 값으로 반환할 수 있는 모듈
  • 보통 함수명에는 sf_~ , f_~ 이런식으로 함수명을 작성한다.(stored function)
# 문법
CREATE FUNCTION 함수명(파라미터명 파라미터_타입,...)
    RETURNS 반환타입
BEGIN
    #로직작성
        #DECLARE 로컬변수명 변수타입; -> 변수 선언
        #SELECT ~ INTO 로컬변수명; -> 조회한 내용은 변수에 저장해야 사용 가능
        # SET 변수명 = 값 -> 변수에 값을 할당
    RETURN 반환타입에 맞는 값 or 변수;
END;

# 예시 - 비밀번호를 마스킹 처리하는 함수
CREATE FUNCTION sf_password(password VARCHAR(255))
    RETURNS VARCHAR(255)
BEGIN

    RETURN
        CASE
            WHEN LENGTH(password) > 2 THEN CONCAT(SUBSTR(PASSWORD,1,2),'**')
            ELSE '****'

END;

# 예시 - 이름 얻는 함수
CREATE FUNCTION `SP_GET_NAME`(
    NAME VARCHAR(20)
    , AGE INTEGER -- 파라미터 선언
) RETURNS varchar(20) -- 반환할 데이터타입
BEGIN
    DECLARE AGE_TITLE VARCHAR(20);
    DECLARE NAME_TITLE VARCHAR(20);
    DECLARE RETURN_VALUE VARCHAR(20); -- 변수 선언

    SELECT CONCAT(NAME, ' IS ') 
      INTO NAME_TITLE; -- 조회한 컬럼은 INTO로 변수에 넣어야 함

    IF(AGE > 30) THEN
        SET AGE_TITLE = 'OLD'; -- 값 할당
    ELSE
        SET AGE_TITLE = 'YOUNG';
    END IF;

    SET RETURN_VALUE = CONCAT(NAME_TITLE, AGE_TITLE);

    RETURN RETURN_VALUE;
END;

프로시저

  • 여러 개의 쿼리를 같이 실행시킬 수 있다
    • 같이 실행시켜야하는 쿼리들을 하나로 묶어서 실행시키므로 네트워크 부하를 줄일 수 있다.
      • 10개 쿼리를 네트워크로 따로 10번 보내는 것 보다 한번에 보내는게 이득이기 때문
  • 미리 저장해놓기 때문에 이미 컴파일이 완료된 상태라 처리시간이 빠르다.
  • call로 호출
  • sp_ ~, p_~
# 문법
CREATE PROCEDURE 프로시저명()
BEGIN

    # 실행시킬 쿼리문 작성...

END;

# 호출 방법
CALL 프로시저명();

# 삭제
DROP PROCEDURE 프로시저명; 

트리거

  • 특정 조건이 만족하면 자동으로 실행되는 것을 의미
  • 보통, 특정 테이블에 INSERT, DELETE, UPDATE 같은 DML 문이 수행되었을 때 자동으로 처리해야할 작업들을 트리거로 설정해놓을 수 있다.
  • 트리거는 행 트리거와 문장 트리거로 나눠진다.
  • 트리거 자체가 무한루프 빠지거나 그럴 위험이 있어서 잘 생각해보고 조심히 쓰자.

행 트리거

  • 조건을 만족하는 여러 개의 행에 대해 트리거를 반복적으로 여러번 수행하는 방법
  • FOR EACH ROW 옵션 사용
  • 변경 전 또는 변경 후의 행은 old , new라는 변수를 사용하여 읽을 수 있다.
    • old : delete로 삭제된 데이터 or update로 바뀌기 전 데이터
    • new : insert로 새로 삽입된 데이터 or update로 바뀐 후의 데이터
트리거 이벤트 OLD NEW
INSERT X O
UPDATE O O
DELETE O X

문장 트리거

  • 트리거가 설정된 테이블에 트리거 이벤트가 발생하면 많은 행에 대해 변경 작업이 발생하더라도 오직 한번만 트리거를 발생시키는 방법
  • 컬럼값이 변화가 생길때마다 스스로 알아서 실행된다. (FOR EACH ROW 옵션 사용 안함)

기타

  • 트리거가 실행되는 시기를 BEFORE , AFTER로 지정한다.

예시

# 예시
# 트리거 생성
CREATE TRIGGER tg_player_update_history
    #  {BEFORE | AFTER} {INSERT | UPDATE| DELETE } 중 언제 어떤 작업을 할지 정한다
    # 여기서는 player 테이블을 업데이트 하기 전에 트리거 실행
    BEFORE UPDATE ON player
    # 영향받은 로우에 대해 실행(행 트리거로 설정)
    FOR EACH ROW 

    BEGIN
        # 변경되기 이전 이름과 포지션을 history에 삽입
      INSERT INTO player_history VALUES(OLD.name,OLD.position);
    END;

# 트리거 삭제
DROP TRIGGER 트리거명;

'DB' 카테고리의 다른 글

JOIN  (0) 2022.05.17
DDL - 테이블 관련 SQL  (0) 2022.05.16
DBMS별 데이터 타입  (0) 2022.05.16

댓글