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. Для соседних задач пригодятся эти разборы:
- EXISTS в SQL на простых примерах
- GROUP BY и HAVING: группировка без каши
- INSERT, UPDATE, DELETE без потери данных
- JOIN в SQL: INNER, LEFT и ошибки новичка