더북(TheBook)

함수 생성

PL/SQL에서 말하는 함수는 4장에서 배웠던 SQL 함수를 말하는 것이 아니다. SQL 함수는 오라클에서 제공하는 내장 함수이고(그래서 빌트인 함수라고도 함), 여기에서 말하는 함수는 사용자가 직접 로직을 구현하는 사용자 정의 함수를 말한다.

SQL 함수편에서 배웠듯이 함수란 매개변수를 받아 뭔가를 처리해 그 결과를 반환하는 데이터베이스 객체이며 사용자 정의 함수도 마찬가지다. 오라클에서 제공하는 빌트인 SQL 함수가 많긴 하지만, 프로젝트를 진행하다 보면 프로젝트 성격에 맞게 다양한 함수를 직접 구현해 사용해야 할 때가 많다. 먼저 함수의 구문부터 살펴 보자.

    CREATE OR REPLACE FUNCTION 함수 이름 (매개변수1, 매개변수2, ...)
    RETURN 데이터타입;
    IS[AS]
      변수, 상수 등 선언
    BEGIN
      실행부
     
      RETURN 반환값;
    [EXCEPTION
      예외 처리부]
    END [함수 이름];

CREATE OR REPLACE FUNCTION: CREATE OR REPLACE 구문을 사용해 함수를 생성한다. 최초 함수를 만들고 나서 수정을 하더라도 이 구문을 사용해 계속 컴파일할 수 있고 마지막으로 수정된 최종본이 반영된다.

매개변수: 함수로 전달되는 매개변수로, “매개변수명 데이터 타입” 형태로 명시한다. 매개변수는 생략할 수 있다.

RETURN 데이터 타입: 함수가 반환할 데이터 타입을 지정한다.

RETURN 반환값: 매개변수를 받아 특정 연산을 수행한 후 반환할 값을 명시한다.

그럼 SQL 함수 중 나머지를 반환하는 MOD 함수를 사용자 정의 함수로 구현해 보자. 이 함수는 피젯수와 젯수, 두 개의 매개변수를 받아 나눗셈을 한 후 나머지를 반환하는데, 동일한 기능을 수행하는 my_mod란 사용자 정의 함수를 만들어 보자.

입력

    CREATE OR REPLACE FUNCTION my_mod ( num1 NUMBER, num2 NUMBER )
       RETURN NUMBER             -- 반환 데이터타입은 NUMBER
    IS
       vn_remainder NUMBER := 0; -- 반환할 나머지
       vn_quotient  NUMBER := 0; -- 몫
    BEGIN
       vn_quotient  := FLOOR(num1 / num2); -- 피젯수/젯수 결과에서 정수 부분을 걸러 낸다
       vn_remainder := num1 - ( num2 * vn_quotient); --나머지 = 피제수 - ( 제수 * 몫)

       RETURN vn_remainder;  -- 나머지를 반환

    END;

결과

    FUNCTION MY_MOD이(가) 컴파일되었습니다.

오류없이 성공적으로 컴파일되었다. 소스에 대한 상세 로직은 주석을 보면 알 수 있을 것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.