Хранимые процедуры и их назначение.
Хранимая процедура – это отдельная программа, написанная на SQL для процедур и триггеров. Сами процедуры хранятся в базе данных. Хранимые процедуры позволяют вести поиск и обработку данных непосредственно на сервере, обеспечивая максимальную независимость клиентской части приложений. В них могут использоваться любые конструкции SQL для процедур и триггеров. Они, как обычные программы, могут получать входные параметры и возвращать значения вызвавшим их приложениям. Кроме того, они могут возвращать не только отдельный набор значений – строку, но и множество строк, которое можно рассматривать как виртуальную таблицу.
Хранимая процедура может также вызываться непосредственно из приложения или других хранимых процедур или триггеров. Хранимые процедуры, возвращающие множество строк, можно использовать в команде SELECT на месте таблиц или обзоров.
Использование хранимых процедур дает ряд преимуществ:
- Модульность проектирования. Приложения, которые обращаются к одной базе данных, могут совместно использовать хранимые процедуры, устраняя двойной код, уменьшая размер приложений и устраняя потенциальные ошибки.
- Локализация изменений. Если процедура модифицируется, то все внесенные изменения автоматически отражаются во всех приложениях, которые используют процедуру, обеспечивая их согласованность. При этом нет необходимости в перетрансляции и перекомпоновке приложений.
- Ускорение обработки. Хранимые процедуры выполняются сервером, а не клиентом, что позволяет ускорить обработку запросов и сократить сетевой трафик.
Процедуры по своему назначению разделяются на два вида: выполнимые процедуры и процедуры выбора.
Выполнимая процедура – это обычная программа, которая получает несколько (возможно и не получает) параметров, выполняет какие-либо действия в базе данных и возвращает несколько (возможно и не возвращает) значений.
Процедура выбора – это программа, которая получает несколько (возможно и не получает) параметров, и возвращает множество (возможно пустое) наборов значений. Другими словами, процедура выбора создает вычисляемую таблицу, хотя такая таблица никуда не записывается. Это позволяет обращаться к процедуре, как к таблице, используя команду SELECT.
Оператор присваивания
Формат:
Переменная = выражение;
Оператор объявления переменных DECLARE
Оператор DECLARE применяется в хранимых процедурах и триггерах и размещается в начале их тела непосредственно перед скобкой BEGIN, за которой размещаются все исполнимые операторы. Все используемые переменные должны быть объявлены. Оператор объявления завершается ";". Одним оператором может быть объявлена только одна переменная, и объявления имеют смысл только внутри хранимой процедуры или триггера.
Формат:
DECLARE VARIABLE <переменная> <тип данных>;
Оператор генерации исключения
Генерирует сообщение об ошибке (исключение). Применяется в хранимых процедурах и триггерах.
Формат:
EXCEPTION имя_исключения;
Имя_исключения – имя генерируемого исключения. Исключение с данным именем должно быть предварительно создано в базе командой CREATE EXCEPTION.
Оператор вызова процедуры
Оператор осуществляет вызов хранимой процедуры. Применяется в хранимых процедурах и триггерах.
Формат:
EXECUTE PROCEDURE <название> [<список параметров>]
[RETURNING_VALUES <список параметров>];
<название> – имя вызываемой процедуры. Сама процедура должна быть предварительно создана в базе командой CREATE PROCEDURE.
<список параметров>, заданный после имени процедуры – это список входных параметров процедуры (если процедура не требует параметров, то может отсутствовать). Отдельные параметры могут быть константами или переменными. Перед именем переменной ставится ":", кроме случаев использования контекстных переменных NEW и OLD. <список параметров>, заданный после RETURNING_VALUES – список возвращаемых процедурой значений (если процедура возвращает значения). Перед именем возвращаемых значении ставится ":". В триггерах и процедурах использование вызовов других процедур аналогично использованию подпрограмм в традиционных алгоритмических языках.
Замечание! При вызове из прикладных программ на базовых языках синтаксис вызова отличается от приведенных.
Оператор ветвления
Оператор ветвления IF ... THEN ... ELSE обеспечивает выполнение того или иного действия в зависимости от истинности проверяемого условия.
Формат:
If (<условие>) THEN <выражение1>
[ELSE<выражение 2>];
Если условие выполнено (значение TRUE), то выполняется оператор, следующий за конструкцией THEN, иначе выполняется оператор, следующий за конструкцией ELSE, если она присутствует.
Оператор цикла
Цикл FOR обеспечивает выполнение заданного оператора для каждой строки команды SELECT. Цикл FOR может использоваться в хранимых процедурах и триггерах.
Формат:
FOR<выражение_SELECT> DO<операторы>;
FOR SELECT – инструкция цикла, которая отыскивает строку, указанную в <выражение_ select> и для каждой строки исполняет оператор или блок операторов, указанный после ключевого слова DO.
Конструкция <выражение_ select> представляет собой обычную команду SELECT, к которой добавлена обязательная здесь опция INTO и которая должна быть последней опцией команды SELECT.
В опции INTO перечисляются имена локальных переменных или параметров процедуры, которым присваиваются соответствующие значения выбранных командой SELECT столбцов. Имена переменных должны предваряться символом ":".
Пример.
FOR SELECT surname, name FROM student
INTO :fam, :s_name
DO
IF(fam>P1) THEN
IF(fam<P2) THEN SUSPEND;
Здесь оператор SUSPEND обеспечивает передачу вызывающему приложению данных, удовлетворяющих дополнительному условию.
Оператор цикла WHILE
Оператор цикла WHILE обеспечивает выполнение оператора, указанного после ключевого слова DO пока указанное после WHILE условие истинно. Цикл WHILE может использоваться в хранимых процедурах и триггерах.
Формат:
WHILE ( <условие>) DO<операторы>;
WHILE ... DO – оператор выполнения цикла, который повторяет оператор или блок операторов, указанных после DO, пока условие <условие> истинно. Условие проверяется в начале каждого цикла.
Оператор генерации события POST_EVENT
Оператор POST_EVENT используется для генерации события, которое может быть в дальнейшем обработано в приложениях.
Сама обработка событий в InterBase строится по следующей схеме.
1. Приложение выдает команду
EVENT INIT список_событий (имя_событияl [,имя_события2 ...]);
По этой команде создается список событий, содержащий имена событий имя_событияl , имя_события2 ...
2.То же или другое приложение выдает команду
EVENT WAIT список_событий;
По этой команде приложение приостанавливается и ожидает наступления одного из событий в списке событий.
3. Само событие генерируется внутри триггера или хранимой процедуры командой POST_EVENT. После того как такое событие произошло, приложение, ожидающее событие, получает соответствующее сообщение и продолжает свою работу. Такой механизм позволяет приложениям обрабатывать различные специфические ситуации при работе с базой данных.
Внутри триггеров и хранимых процедур реализуется только команда POST_EVENT.
Формат:
POST_EVENT <имя_события>;
Параметр <имя_события> может быть либо символьным литералом в кавычках, либо строковой переменной.
Замечание! Имена переменных в хранимых процедурах не должны предваряться символом ":" нигде, кроме как в командах SELECT, INSERT, UPDATE, DELETE, что позволяет отличать их от имен столбцов.
При выполнении процедуры команда POST_EVENT сообщает диспетчеру событий о наступлении события. Диспетчер событий следит за приложениями, ждущими событий, и извещает об их наступлении.