PostgreSQL - Функции
Функции PostgreSQL , также известные как Хранимые Процедуры, позволяют Вам выполнять операции, которые обычно растягиваются на 7 запросов в одной функции внутри базы данных.
Функции позволяют повторно использовать базу данных, поскольку другие приложения могут напрямую взаимодействовать с Вашими хранимыми процедурами вместо промежуточного уровня или дублирующего кода.
Функции могут создаваться на любом из языков на Ваш выбор: SQL, PL/pgSQL, C, Python и т.д.
Синтаксис
Базовый синтаксис для создания функции выглядит следующим образом:
CREATE [OR REPLACE] FUNCTION function_name (arguments)
RETURNS return_datatype AS $variable_name$
DECLARE
declaration;
[...]
BEGIN
< function_body >
[...]
RETURN { variable_name | value }
END; LANGUAGE plpgsql;
Где,
- function-name указывает название функции;
- [OR REPLACE] опция позволяет модифицировать существующую функцию;
- Функция должна содержать команду возврата (return);
- RETURN указывает тип данных, который вы собираетесь вернуть из функции. return_datatype может быть базовым, составным или доменным типом или может ссылаться на тип столбца таблицы;
- function-body содержит часть, которая должна быть исполнена;
- Ключевое слово AS используется для создания автономной функции;
- plpgsql – название языка, на котором написана функция. В нашем случае используется PostgreSQL, это может быть SQL, C, internal или имя пользовательского процедурного языка. Для обратной совместимости имя может быть заключено в одинарные кавычки.
Пример
Приведенный ниже пример показывает, как создается автономная функция. Данная функция показывает, сколько всего записей содержит таблица COMPANY. Используем таблицу COMPANY:
testdb# select * from COMPANY; id | name | age | address | salary ----+-------+-----+-----------+-------- 1 | Paul | 32 | California| 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norway | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall| 45000 7 | James | 24 | Houston | 10000 (7 rows)
Функция totalRecords() выглядит так:
CREATE OR REPLACE FUNCTION totalRecords ()
RETURNS integer AS $total$
declare
total integer;
BEGIN
SELECT count(*) into total FROM COMPANY;
RETURN total;
END;
$total$ LANGUAGE plpgsql;
Как только вышеописанный запрос будет обработан, получим следующий результат:
testdb# CREATE FUNCTION
Теперь обратимся к этой функции и посмотрим, сколько записей содержит таблица COMPANY:
testdb=# select totalRecords();
Результат следующий:
totalrecords
--------------
7
(1 row)



