Когда вы используете такую утилиту для интерактивного создания модулей 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 для хранимых процедур и триггеров