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;