SQL

Как вызвать функцию в PostgreSQL: SELECT, параметры и результат

В PostgreSQL функцию чаще всего вызывают через SELECT. Если функция возвращает одно значение, вы получите одну ячейку. Если функция возвращает таблицу или набор строк, с ней можно работать почти как с таблицей: выбирать столбцы, фильтровать и соединять с другими данными

Запрос «как обратиться к функции SQL» часто появляется у тех, кто видел функцию в документации или в чужой базе, но не понимает, как ее запустить. В PostgreSQL важно знать имя функции, список параметров и тип результата

Самый простой вызов функции

Функция без параметров:

SELECT now();

Функция с параметрами:

SELECT round(125.678, 2);

Результат:

round
125.68

Здесь round — встроенная функция PostgreSQL. Пользовательские функции вызываются так же, если у вас есть права на их выполнение

Пользовательская функция с параметром

Создадим простую функцию:

CREATE OR REPLACE FUNCTION add_vat(price numeric)
RETURNS numeric
LANGUAGE sql
AS $$
    SELECT price * 1.20;
$$;

Вызов:

SELECT add_vat(100) AS price_with_vat;

Ожидаемый результат:

120.00

Если функция лежит не в схеме public, укажите схему явно:

SELECT billing.add_vat(100);

Именованные аргументы

Если функция принимает несколько параметров, можно вызывать ее позиционно:

SELECT calculate_discount(1000, 10);

Или с именами аргументов:

SELECT calculate_discount(price => 1000, discount_percent => 10);

Именованный вызов удобен, когда параметров много и легко перепутать порядок. Но имена должны совпадать с объявлением функции

Функция, которая возвращает таблицу

Пример функции:

CREATE OR REPLACE FUNCTION expensive_products(min_price numeric)
RETURNS TABLE(product_id int, product_name text, product_price numeric)
LANGUAGE sql
AS $$
    SELECT id, name, price
    FROM products
    WHERE price >= min_price;
$$;

Вызов:

SELECT *
FROM expensive_products(1000);

Такую функцию можно использовать в запросе как источник данных:

SELECT product_name, product_price
FROM expensive_products(1000)
ORDER BY product_price DESC;

Как посмотреть, какие функции есть в базе

Через information_schema:

SELECT routine_schema, routine_name, routine_type
FROM information_schema.routines
WHERE routine_type = 'FUNCTION'
ORDER BY routine_schema, routine_name;

Если функций много, добавьте фильтр по схеме или имени:

SELECT routine_schema, routine_name
FROM information_schema.routines
WHERE routine_name ILIKE '%discount%';

Мини-практика

Создайте функцию full_name, которая принимает имя и фамилию, а возвращает одну строку. Затем вызовите ее через SELECT

CREATE OR REPLACE FUNCTION full_name(first_name text, last_name text)
RETURNS text
LANGUAGE sql
AS $$
    SELECT first_name || ' ' || last_name;
$$;

SELECT full_name('Иван', 'Петров') AS result;

Ожидаемый результат:

result
Иван Петров

Частые ошибки

  • Пишут имя функции без SELECT
  • Не указывают схему, если функция не в public
  • Передают параметры не того типа
  • Путают функцию и процедуру
  • Не имеют прав EXECUTE на функцию
  • Ожидают таблицу, хотя функция возвращает одно значение

Что почитать дальше по SQL

Если нужен общий маршрут по теме, откройте рубрику SQL. Для соседних задач пригодятся эти разборы:

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x