SQL пользовательские функции#

SQL пользовательская функция (UDF), также известная как SQL routine — это пользовательская функция, которая использует язык SQL и его конструкции для определения функции.

Объявление SQL UDF#

Объявите SQL UDF с помощью ключевого слова FUNCTION. В дополнение к встроенным функциям и операторам, а также другим UDF, могут использоваться следующие конструкции:

Минимальный пример объявляет UDF doubleup, которая возвращает входное целое значение x, умноженное на два. Пример показывает объявление как Inline пользовательские функции и вызов с значением 21, что даёт результат 42:

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

Та же UDF может быть объявлена как Catalog user-defined functions.

Простые примеры доступны в документации по каждому оператору, а для более сложных сценариев с использованием нескольких операторов смотрите Примеры SQL UDF.

Метки (Labels)#

SQL UDF могут содержать метки (labels), которые используются как маркеры для конкретных блоков перед следующими ключевыми словами:

  • 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;

Метки можно использовать с операторами ITERATE и LEAVE для управления выполнением блока. Это также работает для вложенных блоков и меток.

Ограничения#

К SQL UDF применяются следующие ограничения:

  • UDF должны быть объявлены до их использования.

  • Рекурсия не может быть объявлена или выполнена.

  • Взаимная рекурсия не может быть объявлена или выполнена.

  • Запросы не могут выполняться внутри UDF.

Это означает, что UDF не могут использовать запросы SELECT для получения данных или любые другие запросы для обработки данных внутри UDF. Вместо этого запросы могут использовать UDF для обработки данных. UDF работают только с входными значениями и возвращают результат исключительно через оператор RETURN.