Хранимая процедура – отдельная программа, написанная на SQL для процедур и триггеров InterBase. Сами процедуры хранятся в базе данных. Хранимые процедуры позволяют вести поиск и обработку данных непосредственно на сервере, обеспечивая максимальную независимость клиентской части приложений. В них могут использоваться любые конструкции SQL для процедур и триггеров (см. следующий раздел), кроме контекстных переменных NEW.column, OLD.column, применимых только в триггерах. Они, как обычные программы, могут получать входные параметры и возвращать значения вызвавшим их приложениям. Кроме того, могут возвращать не только отдельный набор значений – строку, но и множество строк, которое можно рассматривать как виртуальную таблицу.
Хранимая процедура может также вызываться непосредственно из приложения или других хранимых процедур или триггеров. Хранимые процедуры, возвращающие множество строк, можно использовать в команде SELECT на месте таблиц или обзоров.
Использование хранимых процедур дает ряд преимуществ:
|
|
- Модульность проектирования. Приложения, которые обращаются к одной базе данных, могут совместно использовать хранимые процедуры, устраняя двойной код, уменьшая размер приложений и устраняя потенциальные ошибки.
- Локализация изменений. Если процедура модифицируется, то все внесенные изменения автоматически отражаются во всех приложениях, которые используют процедуру, обеспечивая их согласованность. При этом нет необходимости в перетрансляции и перекомпоновке приложений.
- Ускорение обработки. Хранимые процедуры выполняются сервером, а не клиентом, что позволяет ускорить обработку запросов и сократить сетевой трафик. Последнее особенно важно для удаленного клиентского доступа.
Процедуры по своему назначению разделяются на два вида: выполнимые процедуры и процедуры выбора.
Выполнимая процедура – это обычная программа, которая получает несколько (возможно, и ноль) параметров, выполняет какие-либо действия в базе данных и возвращает несколько (возможно, и ноль) значений.
Процедура выбора – это программа, которая получает несколько (возможно, и ноль) параметров, выполняет какие-либо действия в базе Данных и возвращает множество (возможно, пустое) наборов значений. Другими словами, процедура выбора создает вычисляемую таблицу, хотя такая таблица никуда и не записывается. Это позволяет обращаться к процедуре, как к таблице, используя команду SELECT.
Синтаксически можно обращаться к выполнимой процедуре, как к процедуре выбора (может понадобиться включение оператора SUSPEND в тело процедуры для корректного вывода результата), получая при этом в ответ в точности одну строку, а к процедуре выбора, как к выполнимой, получая при этом в ответ первую строку формируемой таблицы. Ценность такой инверсии обращений в лучшем случае нулевая, поэтому, несмотря на отсутствие прямого запрета ее использования, нет оснований для практического применения инверсных вызовов хранимых процедур. Например:
SELECT RESULT FROM MODULUS (12, 5);
Или EXECUTE PROCEDURE MODULUS 12, 5;