Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
returns language_handler
as ‘$libdir/plpgsql’, ‘plpgsql_call_handler’
language ‘c’;
create trusted procedural language ‘plpgsql’
handler plpgsql_call_handler;
Первая из них создает функцию-обработчик на базе библиотечной функции, вторая – собственно язык PL/pgSQL на основе созданного выше обработчика.
Если вы считаете, что процедурный язык будет нужен вам во всех (или большинстве) базах данных, то таким же образом его можно добавить в БД template1. В результате этого поддержка PL/pgSQL будет автоматически добавляться во все создаваемые впоследствии базы (при создании новой базы по умолчанию в нее переносятся все объекты из БД template1, хотя шаблон может быть задан и явно, указанием параметра TEMPLATE в команде CREATE DATABASE).
Сначала немного теории. Триггер связывает функцию с операцией модификации таблицы. Следовательно, чтобы было что связывать, мы должны создать триггерную функцию. Синтаксис функции на языке PL/pgSQL следующий:
create [or replace] function <имя функции>(<аргументы>)
returns <тип возврата> as ‘<тело функции>’
language ‘plpgsql’;
Есть и другие опции. С ними можно ознакомиться в документации, а сейчас они нам не интересны. Необязательная фраза «or replace» позволяет перезапись функции при попытке создать другую с таким же именем (например, записать исправленный вариант). Без этого ключевого слова будет сгенерирована ошибка и потребуется сначала удалить существующую функцию и лишь затем записать на ее место новую.
Скобки после имени функции обязательны, даже если функция не имеет аргументов. Слово «returns» задает тип возвращаемых функцией данных. Указание языка также обязательно. В нашем случае это «plpgsql».
Тело функции имеет следующую структуру:
DECLARE
необязательный раздел определений
BEGIN
Операторы функции
END;
Последним оператором функции должен быть оператор «return», возвращающий данные указанного выше типа, даже если выход из функции осуществляется раньше (например, в блоке проверки условия) и эта команда никогда не получит управление.
Как и любой нормальный язык программирования, PL/pgSQL позволяет оперировать переменными. Все переменные (за одним исключением, о котором будет упомянуто ниже) должны быть описаны в разделе DELCARE, т.е. их необходимо перечислить с указанием типа данных. В этом же разделе допускается и инициализация переменной начальным значением с помощью ключевого слова DEFAULT. Общий синтаксис описания следующий:
<переменная> <тип> [ DEFAULT <значение>];
Вместо слова «DEFAULT» допускается использование оператора присваивания «:=», но, на мой взгляд, такая запись выглядит несколько коряво. Точка с запятой в конце каждого описания обязательна. Переменная может быть любого типа, который поддерживается в PostgreSQL. Кроме того, существуют три специальных типа данных: RECORD, table%RECTYPE и table.field%TYPE. Первый описывает запись любой таблицы, второй – запись указанной таблицы table, третий создает переменную такого же типа, как и тип указанного поля field таблицы table. Примеры использования этих типов данных будут приведены ниже.
В основной секции, заключенной в операторные скобки BEGIN-END, могут использоваться операторы присваивания, математические операторы, ветвления, циклы, вызовы других функций. Кроме того, тело функции может содержать вложенные блоки, имеющие ту же структуру (т.е. DECLARE-BEGIN-END). Видимость переменных распространяется на блок, в котором она описана, и на все вложенные блоки. Ниже конспективно перечислены основные операторы языка PL/pgSQL, которые понадобятся нам в дальнейшем: