Выбрать главу

Когда вы используете такую утилиту для интерактивного создания модулей PSQL, она обычно выдает исключение на оператор SET TERM, потому что как оператор SQL он не имеет смысла за пределами isql. При этом в скриптах эти утилиты обычно обрабатывают оператор SET TERM и внутренне используют альтернативный терминатор так же, как и утилита isql.

Таким образом, включайте оператор SET TERM В isql, если вы используете этот инструмент интерактивно, а также включайте его в скрипты.

Альтернативный терминатор может быть любой, нравящейся вам строкой символов, за исключением точки с запятой, пробела и апострофа. Если вы используете буквенный символ, он будет чувствительным к регистру. Если вам так нравится, можете задать терминатор, содержащий несколько символов, включая пробелы; он только не может быть зарезервированным ключевым словом. Оба следующих оператора допустимы:

SET TERM ^

SET TERM boing! ;

! ! !

СОВЕТ. He будьте только слишком изобретательными при создании ваших строк терминаторов, иначе вам придется набирать большой текст!

. ! .

В определениях PSQL применяйте точку с запятой во всех внутренних операторах за исключением BEGIN и END и используйте альтернативный терминатор в конечном операторе END:

. . .

END ^

Для возврата к "нормальному" оператору терминатора выдайте второй оператор SET TERM, который изменит результат первого:

. . .

END ^

COMMIT ^

SET TERM ;^

Рис. 29.1. Обязательные элементы в определении модуля PSQL

На рис. 29.1 основные элементы определения модуля PSQL отделены для иллюстрации требуемых элементов в секциях HEADER (Заголовок) и BODY (Тело) модуля.

Обязательные части затенены.

Элементы заголовка

Имя процедуры или триггера должно быть уникальным в базе данных.

Для триггера:

* ключевое слово FOR и ИМЯ таблицы идентифицируют ту таблицу, операции с которой вызывают данных триггер;

* режим (ACTIVE или INACTIVE);

* параметр фазы (BEFORE или AFTER) определяет, когда вызывается триггер;

* параметр события (INSERT, UPDATE, DELETE)[113];

* необязательное ключевое слово POSITION, за которым следует целое число, указывающее последовательность вызова.

Для хранимой процедуры:

* необязательный список входных параметров и их типов данных;

* если процедура возвращает значения вызвавшей программе, то список выходных параметров и их типов данных.

Элементы тела

Для хранимых процедур и триггеров:

* тело модуля может начинаться со списка из одного или более объявлений локальных переменных (имя и тип данных SQL - домен указывать нельзя);

* блок операторов на языке процедур и триггеров Firebird, заключенный в операторные скобки BEGIN и END. Блок сам может включать другие блоки, следовательно, может существовать много уровней вложенности;

* некоторые встроенные блоки могут быть обработчиками исключений, возникающих в предшествующих блоках. Такие блоки являются условными в соответствии с предшествующим предикатом WHEN. Модуль глобальных обработчиков исключений должен предшествовать всем встроенным блокам.

Элементы языка

В табл. 29.1 показаны элементы языка PSQL, доступные в Firebird.

Таблица 29.1. Расширения PSQL для хранимых процедур и триггеров

Оператор

Описание

В. 1.5

В. 1.0.x

BEGIN ... END

Определяет блок операторов, которые выполняются как одно целое. Зарезервированное слово BEGIN начинает блок; зарезервированное слово END завершает его. Ни за одним из них не должна следовать точка с запятой. В версии 1.0.x нельзя выдать оператор CREATE PROCEDURE без хотя бы одного оператора между BEGIN и END. "Пустые" определения допустимы в версии 1.5 и выше

Да

Да

переменная = выражение

Присваивает значение выражения переменной- локальной переменной, входному параметру или выходному параметру

Да

Да

/* текст комментария */

Комментарий программиста, где текст может содержать любое количество строк между парой /* */. Может быть также использован для встроенных комментариев

Да

Да

-- текст комментария

Комментарий программиста из одной строки, где текст может быть встроенным (только версия 1.5) или может занимать одну строку, где маркер двойного минуса (-) является первым элементом в строке

Да

Да

EXCEPTION имя-исключения

Вызывает именованное исключение для возможной обработки в блоке WHEN. Само исключение должно быть предварительно определено администратором базы данных с использованием CREATE EXCEPTION

Да

Да

EXCEPTION

Вызывает исключение

Да

Нет

EXCEPTION имя-исключения сообщение-времени-выполнения

Вызывает именованное исключение и присоединяет к нему сообщение времени выполнения - локальную переменную типа VARCHAR, которой во время выполнения может быть присвоено значение. Подробности определения и использования исключений см. в главе 32

Да

Нет

EXECUTE PROCEDURE имя-процедуры [переменная [, переменная ...]] [ RETURNING_VALUES переменная [, переменная. . .]]

Выполняет хранимую процедуру имя- процедуры. Входные аргументы следуют за именем процедуры; возвращаемые значения следуют за ключевым словом RETURNING VALUES. Допустимы вложенные процедуры и рекурсия. Входные и выходные параметры должны быть переменными, определенными в процедуре

Да

Да

EXECUTE STATEMENT <строка>

Выполняет оператор динамического SQL, содержащийся в <строка>

Да

Нет

EXIT

Переходит на конечный оператор END. Необязателен

Да

Да

FOR ... SELECT ... INTO ... DO

Синтаксис составного блока цикла для обработки неявного курсора и (необязательной) генерации виртуальной таблицы для направления выхода запроса SELECT клиенту. Подробности см. в разд. "SELECT для множества строк"

Да

Да

IF . . . THEN .. . [ELSE] ...

Синтаксис составного ветвления. Подробности см. в разд. "Условные блоки" позже в этой главе

Да

Да

LEAVE[114]

Оператор не принимает параметров. Используется для выхода из цикла. Выполнение переходит к первому оператору, следующему за концом того блока, который включает цикл, где был выполнен оператор LEAVE

Да

Нет

NEW. имя-столбца

Только триггеры. Контекстные переменные, доступные для триггеров INSERT и UPDATE. Существует одна переменная NEW для каждого столбца таблицы, содержащая новое значение, передаваемое клиентским запросом. Также доступна в некоторых ограничениях CHECK. Заметим, что в версии 1.5 в триггерах для нескольких действий ссылка на NEW. переменная не является ошибкой, поскольку она вернет NULL, если используется в контексте удаления

Да

Да

OLD.имя-столбца

Только триггеры. Контекстные переменные, доступные для триггеров INSERT и DELETE. Существует одна переменная OLD для каждого столбца таблицы, содержащая значение, которое имел столбец до выдачи клиентского запроса. Также доступна в некоторых ограничениях CHECK. Заметим, что в версии 1.5 в триггерах для нескольких действий ссылка на OLD.переменная не является ошибкой, даже если триггер включает действия по добавлению данных. Она вернет NULL, если используется в контексте добавления

вернуться

113

Начиная с версии 1.5. существует возможность объединять несколько событий в одном триггере. Подробности см. в главе 31.

вернуться

114

В версии 1.5 LEAVE заменяет недокументированный оператор BREAK, который был частично реализован в версии 1.0.x. Не используйте BREAK.