- •Содержание
- •6.1. Вступление.
- •6.2. Определитель null.
- •6.3. Целостность сущностей.
- •6.4. Ссылочная целостность.
- •6.5. Корпоративные ограничения целостности.
- •6.6. Хранимые процедуры в субд InterBase.
- •6.6.1. Понятие хранимой процедуры.
- •6.6.2. Создание хранимой процедуры.
- •6.6.3. Алгоритмический язык хранимых процедур.
- •Into переменная [, переменная...]
- •6.7. Средства субд InterBase, обеспечивающие приемлимые значения целостность данных.
- •6.7.1. Ограничения на уровне домена.
- •6.7.2. Добавление, изменение и удаление записей.
- •6.7.3. Определение значения поля первичного ключа с помощью генератора.
- •6.7.3. Обеспечение целостности сущности и ссылочной целостность на этапе создания таблицы.
- •6.7.4. Использование триггеров для обеспечения ссылочной целостности.
- •6.7.5. Поддержка целостности данных с помощью хранимых процедур.
- •Контрольные вопросы:
6.6.2. Создание хранимой процедуры.
Хранимая процедура создается оператором
CREATE PROCEDURE ИмяПроцедуры
[(входной_параметр тип_данных [, входной_параметр тип_данных... ])]
[RETURNS
(выходной_параметр тип_данных [, выходной_параметр тип_данных ...])] AS
<тело процедуры>;
Входные параметры служат для передачи в процедуру значений из вызывающего приложения. Изменять значения входных параметров в теле процедуры бессмысленно: эти изменения будут забыты после окончания работы процедуры.
Выходные параметры служат для возврата результирующих значений. Значения выходных параметров устанавливаются в теле процедуры и после окончания ее работы передаются в вызывающее приложение.
И входные, и выходные параметры могут быть опущены, если в них нет необходимости.
Тело процедуры имеет формат
[<объявление локальных переменных процедуры>]
BEGIN
< оператор>
[<оператор> ...]
END
Пример. Хранимая процедура FIND_AUTHOR_NAME возвращает в выходном параметре IN_AUTHOR_NAME имя автора по его коду – IN_AUTHOR_CODE:
CREATE PROCEDURE FindAuthorName
(InAuthorCode INTEGER)
RETURNS(InAuthorName CHAR(30))
AS
BEGIN
SELECT Name
FROM BookAuthors
WHERE Code = : InAuthorCode
INTO : InAuthorName;
SUSPEND;
END
Заметим, что в приведенной процедуре за ненадобностью отсутствует определение локальных переменных. С оператором SELECT мы познакомимся позднее.
6.6.3. Алгоритмический язык хранимых процедур.
Для написания тела хранимой процедуры применяют особый алгоритмический язык. Помимо хранимых процедур, данный язык применяется также для написания триггеров, с которыми мы познакомимся чуть позже.
Рассмотрим конструкции алгоритмического языка хранимых процедур и триггеров.
Объявление локальных переменных. Локальные переменные, если они определены в процедуре, имеют срок жизни от начала выполнения процедуры и до ее окончания. Вне процедуры такие локальные переменные неизвестны и попытка обращения к ним вызовет ошибку. Локальные переменные используют для хранения промежуточных значений.
Формат объявления локальных переменных:
DECLARE VARIABLE <имя переменной > <тип данных>;
В качестве типа данных могут использоваться типы данных, стандартно определенные в InterBase.
Оператор присваивания. Оператор присваивания служит для занесения значений в переменные. Его формат:
Имя переменной = выражение;
где в качестве выражения могут выступать переменные, арифметические и строковые выражения, в которых можно использовать встроенные функции, функции, определенные пользователем, а также генераторы. Пример:
РОК = "Покупатель не указан";
Операторные скобки BEGIN ... END. Операторные скобки BEGIN ... END, во-первых, ограничивают тело процедуры, а во-вторых, могут использоваться для указания границ составного оператора.
Под простым оператором понимается единичное разрешенное действие, например:
РОК = "Покупатель не указан";
Под составным оператором понимается группа простых или составных операторов, заключенная в операторные скобки BEGIN ... END.
Оператор IF ... THEN ... ELSE. Условный оператор IF ... THEN .. . ELSE имеет формат
IF (<условие>) THEN
<оператор 1>
[ELSE
<оператор 2>]
В случае, если условие истинно, выполняется оператор 1, если ложно - оператор 2.
Оператор SELECT. Оператор SELECT используется в хранимой процедуре для выдачи единичной сроки. По сравнению с синтаксисом обычного оператора SELECT, в процедурный оператор добавлено предложение