Оператор CREATE
Оператор CREATE
Исходный код процедуры и триггера конструируется внутри "супероператора", который начинается с ключевых слов CREATE PROCEDURE или CREATE TRIGGER и завершается символом терминатора, следующим за конечным оператором END, например:
CREATE PROCEDURE ИМЯ . . .
. . .
AS
. . .
BEGIN
. . .
END ^
В хранимых процедурах и триггерах все операторы, следующие за ключевым словом AS, включают локальные переменные (если присутствуют) и логику программного модуля. Основное различие между триггерами и хранимыми процедурами заключается в заголовке оператора CREATE (СМ. рис. 29.1).
Терминатор операторов
Каждый оператор внутри тела хранимой процедуры или триггера- кроме BEGIN и END- должен заканчиваться точкой с запятой. Никакой другой символ не является допустимым терминатором операторов в PSQL. В DSQL для операторов DML и DDL в Firebird точка с запятой также является терминатором по умолчанию. Она также является стандартом SQL для завершения операторов.
Такая ситуация может создать логическую проблему для синтаксического анализатора, который выполняет предварительную компиляцию наших модулей PSQL: какая точка с запятой завершает операторы внутри модуля, а какая завершает определение CREATE?
Чтобы обойти эту проблему, в Firebird есть синтаксис переключения SET TERM, который позволяет вам устанавливать другой внешний терминатор, который воздействует на внешние операторы, в то время как синтаксический анализатор обрабатывает определения PSQL. В скриптах опытные разработчики часто используют одиночный оператор SET TERM в начале каждого скрипта, чтобы использовать свой любимый альтернативный терминатор в течение всего времени выполнения скрипта. Некоторые инструменты администратора баз данных поддерживают средства конфигурирования альтернативных терминаторов в своих редакторах и программах выделения метаданных.
Операторы SET TERM используются в isql и в скриптах.
Утилита isql предварительно анализирует каждый оператор и отправляет любой завершенный терминатором оператор на сервер в виде одной команды, SET TERM является одним из собственных операторов ISQL, который используется не для пересылки запроса на сервер, а для подготовки собственного синтаксического анализатора для различной интерпретации терминаторов. (Другие операторы SET В ISQL также вызывают специальные действия в программе isql, которые не имеют значения вне isql.)
DSQL совсем не распознает терминаторы операторов. Большинство других утилит, выполняющих скрипты, отправляют операторы DDL на сервер один за другим без терминаторов. Они выполняют свой собственный синтаксический анализ для распознавания начала и завершения операторов CREATE PROCEDURE и передают внутренние терминаторы точка с запятой просто как обычные символы синтаксиса составного оператора.
Когда вы используете такую утилиту для интерактивного создания модулей 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 (Тело) модуля.
Обязательные части затенены.