* Условные операторы управления потоком выполнения.
* Специальные контекстные переменные (только для триггеров) для доступа к старому и новому значению каждого столбца во всех входных наборах DML.
* Отправка определенных пользователем событий базы данных прослушивающим клиентам.
* Исключения, в том числе определенные пользователем, объявленные как объекты базы данных, а также (в версии 1.5) специфичные для контекста сообщения об исключениях, поддержка структуры и синтаксиса для обработки ошибок.
* Входные и выходные аргументы (только для хранимых процедур).
* Инкапсуляция поведения курсора в синтаксисе цикла FOE SELECT ... INTO ... DO.
* Оператор SUSPEND (только для хранимых процедур), предоставляющий возможность написания хранимых процедур, которые выводят виртуальную таблицу на запрос в операторе SELECT - хранимые процедуры выбора.
* Внутренние вызовы хранимых процедур в хранимых процедурах и триггерах.
* Возможность определения множества триггеров для фаз BEFORE (до) и AFTER (после) в триггерах для каждого события DML и задание их позиции в предварительно определенном порядке их исполнения. В версии 1.5 появилась возможность писать условные триггеры BEFORE и AFTER, объединяющие любые из всех возможных событий DML.
За исключением указанных специфических элементов все множество языка PSQL доступно для хранимых процедур и триггеров.
Хранимые процедуры
Хранимые процедуры могут быть использованы в приложениях различными способами.
* Процедуры выбора используются на месте таблицы или просмотра в операторе
SELECT.
* Выполняемые процедуры исполняются оператором EXECUTE PROCEDURE для выполнения одной операции или запуска множества операций на стороне сервера.
* Хранимая процедура может быть вызвана из другой хранимой процедуры или из триггера. Она может вызывать сама себя рекурсивно.
Все хранимые процедуры определяются в сложном операторе DDL CREATE PROCEDURE. Объявления выполняемых хранимых процедур и хранимых процедур выбора следуют одним и тем же синтаксическим правилам. Необязательные языковые элементы отличаются для процедур выбора и выполняемых процедур. Одна процедура может быть вложенной в другую, каждая из которых выполняет часть атомарной последовательности работы, которая будет подтверждена клиентским приложением как единое целое или отменена как целое.
Преимущества использования хранимых процедур
Перечислим преимущества использования процедурных модулей, которые выполняются внутри базы данных.
* Модульное проектирование: все приложения, имеющие доступ к одной базе данных, совместно используют хранимые процедуры, что, следовательно, централизует бизнес-правила, позволяет повторно использовать код, сокращает размер приложений.
* Хорошо налаженная поддержка: когда процедура модифицируется, изменения автоматически распространяются на все приложения без необходимости дальнейшей перекомпиляции на стороне приложения, за исключением изменений, влияющих на наборы входных или выходных аргументов.
* Улучшенное выполнение: выполнение сложной обработки делегируется серверу, сокращая сетевой трафик и нагрузки оперирования с внешними наборами.
* Экономия в архитектуре: клиентские приложения могут сфокусироваться на получении входных данных от пользователя и на управлении интерактивными задачами, в то время как серверу, который предназначен для управления данными, делегируется управление сложными данными и их зависимостями.
* Дополнительная функциональность: искусный доступ к данным, который не может быть достигнут средствами обычного SQL, может быть выполнен одной или группой хранимых процедур.
Триггеры
Триггер является подпрограммой, связанной с таблицей или просмотром, которая автоматически выполняет некоторые действия, когда строка таблицы или просмотра добавляется, изменяется или удаляется.
Триггер никогда не вызывается напрямую. Когда приложение или пользователь пытается выполнить INSERT, UPDATE или DELETE для строки таблицы, триггеры, связанные с этой таблицей, вызываются автоматически. Триггеры могут использовать исключения и события. Они также могут вызывать хранимые процедуры.
Триггеры являются мощным инструментом в различных вариантах использования. Перечислим способы использования триггеров.
* Для выполнения коррелированных изменений при выполнении оператора DML с таблицей. Например, триггер может добавлять записи во внутренний или внешний протокол изменений. Триггер AFTER DELETE (после удаления) может добавить строку в таблицу истории.
* Для проверки исходных данных.
* Для преобразования данных, например, для автоматического конвертирования входного текста в буквы верхнего регистра или для получения значения автоинкрементного ключа из генератора.
* Для информирования приложений об изменениях базы данных с использованием средств сообщения о событиях (event alerter).
* Для выполнения пользовательских каскадных изменений целостности данных.