SQL 사용자 정의 함수

SQL 사용자 정의 함수 (SQL UDF)

함수 정의에 SQL 루틴 언어를 사용하는 사용자 정의 함수예요. SQL 루틴(routine)이라고도 불리며, 제어 흐름 문을 조합해 복잡한 로직을 만들 수 있어요.

출처: 문서

본문

SQL 사용자 정의 함수(SQL 루틴이라고도 함)는 함수 정의에 SQL 루틴 언어와 문을 사용하는 사용자 정의 함수예요.

SQL UDF 선언

FUNCTION 키워드와 다음 문을 사용해 SQL UDF를 선언해요. 내장 함수·연산자·다른 UDF에 더해 다음 문을 사용할 수 있어요:

  • BEGIN
  • CASE
  • DECLARE
  • IF
  • ITERATE
  • LEAVE
  • LOOP
  • REPEAT
  • RETURN
  • SET
  • WHILE

입력 정수 값 x에 2를 곱해 반환하는 UDF doubleup을 선언하는 최소 예시예요. 예시는 인라인 사용자 정의 함수로 선언하고 값 21로 호출해 결과 42를 얻는 방법을 보여줘요:

WITH
  FUNCTION doubleup(x integer)
    RETURNS integer
    RETURN x * 2
SELECT doubleup(21);
-- 42

같은 UDF는 카탈로그 사용자 정의 함수로도 선언할 수 있어요.

각 문 문서에서 간단한 예시를 찾을 수 있고, 여러 문을 결합하는 더 복잡한 사용 사례는 예시 SQL UDF 문서를 참고해요.

명명된 인자

SQL UDF는 매개변수를 이름으로 선언하므로, 위치로 인자를 전달하는 것에 더해 명명 인자 형식 name => value로 호출할 수 있어요. 명명 인자는 어떤 순서로든 올 수 있고, 위치 인자(앞에 와야 함)를 명명 인자와 섞을 수 있어요:

WITH
  FUNCTION clamp(value bigint, lo bigint, hi bigint)
    RETURNS bigint
    RETURN CASE
        WHEN value < lo THEN lo
        WHEN value > hi THEN hi
        ELSE value
    END
SELECT
    clamp(7, 0, 5),                       -- positional: 5
    clamp(value => 7, lo => 0, hi => 5),  -- all named: 5
    clamp(7, hi => 5, lo => 0);           -- mixed: 5

함수가 선언하지 않은 이름을 전달하면 쿼리는 문제의 식별자를 가리키는 진단과 함께 실패해요. 명명 인자 뒤에 위치 인자를 전달하는 것은 문법 오류예요.

레이블

SQL UDF는 다음 키워드 앞의 선언에서 특정 블록을 표시하는 레이블을 포함할 수 있어요:

  • CASE
  • IF
  • LOOP
  • REPEAT
  • WHILE

레이블은 ITERATE 문으로 처리를 계속하거나 LEAVE 문으로 블록을 빠져나올 블록에 이름을 붙이는 데 사용돼요. 이 흐름 제어는 중첩 블록에서도 지원돼, 가장 안쪽 블록뿐 아니라 바깥 블록을 계속하거나 빠져나올 수 있어요. 예를 들어 다음 스니펫은 top 레이블로 REPEAT부터 END REPEAT까지의 전체 블록에 이름을 붙여요:

top: REPEAT
  SET a = a + 1;
  IF a <= 3 THEN
    ITERATE top;
  END IF;
  SET b = b + 1;
  UNTIL a >= 10
END REPEAT;

레이블은 ITERATELEAVE 문과 함께 사용해 블록 처리를 계속하거나 블록을 빠져나올 수 있어요. 이 흐름 제어는 중첩 블록과 레이블에서도 지원돼요.

제한 사항

SQL UDF에는 다음 제한 사항이 적용돼요.

  • UDF는 참조되기 전에 선언되어야 해요.
  • 재귀는 선언하거나 처리할 수 없어요.
  • 상호 재귀도 선언하거나 처리할 수 없어요.
  • UDF 안에서 쿼리를 처리할 수 없어요.

구체적으로 UDF는 데이터를 검색하기 위한 SELECT 쿼리나 UDF 안에서 데이터를 처리하는 다른 어떤 쿼리도 사용할 수 없다는 뜻이에요. 대신 쿼리가 UDF를 사용해 데이터를 처리할 수 있어요. UDF는 입력 값으로 제공된 데이터에만 작동하고 RETURN 문의 출력 데이터만 제공해요.

더 알아보기 (Learn more)

SQL UDF에서 쓸 수 있는 각 제어 문(BEGIN, CASE, DECLARE, IF, LOOP 등)의 상세 문법과 예시는 각 문서에서, 여러 문을 결합한 예시는 예시 SQL UDF 문서에서 확인할 수 있어요.