CREATE [ OR REPLACE ] FUNCTION Пример 1. Создание функции, возвращающей столбец текстовых значений Использование функции, возвращающей столбец текстовых значений Пример 2. Создание функции, возвращающей столбец записей Примечание. Функция, возвращающая столбец записей, может быть использована в операторе SELECT , если она определена как функция SQL ( для функции plpgsql способ использования другой) Использование функции, возвращающей столбец записей Пример 3. Создание функции, возвращающей целое значение Пример 5. Использование функций в классическом SELECT Пример 6. Использование функций, нестандартный вариант (только PostgreSql) Синтаксис команды
CREATE [ OR REPLACE ] FUNCTION
имя_функции ([ [ метод_аргумента ][имя_аргумента ] тип_ аргумента [,…] ])
RETURNS тип_возвращаемого_значения
AS 'определение'
LANGUAGE 'язык'
[ WITH ( атрибут […])]
В PostgreSQL cоздание функций на языке С разрешено только суперпользователям, поскольку эти функции могут содержать системные вызовы, представляющие потенциальную угрозу для безопасности системы. Рассмотрим создание функций sql и plpgsql .
[
iscachable. Оптимизатор может использовать предыдущие вызовы функций для ускоренной обработки будущих вызовов с тем же набором аргументов. Кэширование обычно применяется при работе с функциями, сопряженными с большими затратами ресурсов, но возвращающими один и тот же результат при одинаковых значениях аргументов.
isstrict. Функция всегда возвращает NULL в случае, если хотя бы один из ее аргументов равен NULL. При передаче атрибута isstrict результат возвращается сразу, без фактического выполнения функции.Создание функций SQL
имя_функции ([ [ метод_аргумента ][имя_аргумента ] тип_ аргумента [,…] ])
RETURNS тип_возвращаемого_значения
AS '
оператор SQL;
[оператор SQL;
…]
'
LANGUAGE sql
[ WITH ( атрибут […])];Примеры создания и использования функций sql
-- Функция возвращает имена поставщиков с рейтингом больше $1
select names from s where rg>$1;
' LANGUAGE sql;Результат
sname Блейк Кларк Адамс
- - Функция возвращает сведения о поставщиках с рейтингом больше $1
select ns,names,rg,town from s where rg>$1 order by ns;
' LANGUAGE sql;Результат
result (“S3”, “Блейк ”, 30,”Париж ”) (“S4”, “Кларк ”, 20,“Лондон ”) (“S5”, “Адамс ”, 30,“Афины ”) Создание функций plpgSQL
CREATE [ OR REPLACE ] FUNCTION
имя_функции ([ [ метод_аргумента ][имя_аргумента ] тип_ аргумента [,…] ])
RETURNS тип_возвращаемого_значения
AS '
[ DECLARE
объявления ]
BEGIN
оператор;
[оператор;…]
[EXCEPTION
WHEN условие [ OR условие ... ] THEN
операторы обработки исключения;
[ WHEN условие [ OR условие ... ] THEN
операторы обработки исключения;
... ]
END;
'
LANGUAGE plpgsql
[ WITH ( атрибут […])];
DECLARE
имя_переменной тип_переменной ;
[имя_переменной тип_переменной;…]
EXCEPTION
WHEN others THEN
RAISE exception 'message of error';
Функция RAISE уровня exception генерирует исключение и выдает сообщение об ошибке (подробнее о функции RAISE см. http://www.sbin.org/doc/pg/doc/plpgsql-errors-and-messages.html ).Примеры создания и использования функций plpgsql
DECLARE
i integer;
-- Функция вычисляет количество поставок детали $1
BEGIN
select count(*) from spj into i where spj.np=$1;
-- возвращение результата
return i;
END;
' LANGUAGE plpgsql;
Пример 4. Создание функции, возвращающей вещественное значение
DECLARE
aves real;
-- Функция вычисляет средний вес поставок детали $1
BEGIN
select avg(spj.kol * p.ves ) from spj,p into aves where spj.np=$1 and spj.np=p.np ;
-- возвращение результата
return aves;
END;
' LANGUAGE plpgsql;
apf(p.np) AS kol , avgves(p.np) as sves,
apf(p.np)* avgves(p.np) as oves FROM p; Результат
Np namep kol sves oves P1 Гайка 1 1200 1200 P2 Болт 2 2550 5100 P3 Винт 9 6611.11 59500.001953125 P4 Винт 2 9100 18200 P5 Кулачок 4 3300 13200 P6 Блюм 4 6175 24700 Результат
kol 4
Пример 7. Создание функции, возвращающей курсор
CREATE FUNCTION fun1 (integer) RETURNS refcursor AS '
-- если входной параметр - 0 - функция возвращает список поставщиков -- если входной параметр - 1 - функция возвращает список изделий DECLARE
ref refcursor;
BEGIN if $1=0 then
OPEN ref FOR SELECT * FROM s ;
else
OPEN ref FOR SELECT * FROM j ;
end if;
RETURN ref;
END;
' LANGUAGE plpgsql;Пример 8. Создание функции, генерирующей исключение
CREATE FUNCTION fun_j (character, character, character) RETURNS void AS '
-- первый входной параметр ($1) - номер изделия -- если $1 задан - обновляется строка с таким номером -- если $1 не задан(null) - вставляется новая строка, номер берется из последовательности -- второй входной параметр ($2)- наименование изделия - д.б. непустой-- третий входной параметр ($3)- название города - д.б. непустойDECLARE vns character(6); BEGIN if $2 is null then raise exception 'Некорректное название изделия'; else begin if $3 is null then raise exception 'Некорректное название города'; else begin if $1 is null then vns:='J' || trim( to_char( nextval( 'j_seq' ), '99999' ) ); INSERT INTO j (nj,namej,town) VALUES (vns, $2, $3); else UPDATE j SET namej=$2,town=$3 where nj=$1; end if; Return; end; end if; end; end if; exception when integrity_constraint_violation then raise exception 'Нарушение ограничений целостности'; END;' LANGUAGE plpgsql;
PostgrqSQL позволяет создавать перегружаемые функции. Под этим понимается определение нескольких функций с одинаковыми именами при условии, что каждая из них получает уникальный набор аргументов. Перегрузка создает для пользователя видимость того, что одна функция работает с разными типами входных данных. Пример 9. Создание перегружаемой функции. Перегружаемые функций.
BEGIN
if $1 is null then return $2;
else return $1;
end if;
END;
' LANGUAGE plpgsql;
BEGIN
if $1 is null then return $2;
else return $1;
end if;
END;
' LANGUAGE plpgsql;
BEGIN
if $1 is null then return $2;
else return $1;
end if;
END;
' LANGUAGE plpgsql;
BEGIN
if $1 is null then return $2;
else return $1;
end if;
END;
' LANGUAGE plpgsql;