Шрифт:
Интервал:
Закладка:
Поскольку существующие запросы удаляются из кэша метаданных только тогда, когда последний клиент отключится от базы данных, они вообще никогда не будут обновлены в системах 24/7 (т. е. в системах, работающих 24 часа в сутки и 7 дней в неделю). Существует только один способ гарантировать, что все копии хранимых процедур и триггеров будут удалены из кэша метаданных - завершение всех соединений с базой данных. Когда пользователи снова соединятся с базой данных, они все увидят новые версии хранимых процедур и триггеров.
Классический серверИзменение или удаление хранимой процедуры немедленно воздействует на новые соединения, осуществляемые после подтверждения изменения. Новые соединения, которые вызывают хранимую процедуру, увидят самую последнюю версию. При этом другие соединения продолжают видеть ту версию хранимой процедуры, которую они видели с самого начала соединения. С точки зрения практики имеет смысл отключить всех клиентов до подтверждения изменений таких модулей.
Пора дальшеТеперь мы рассмотрим структуру модулей PSQL: что общего имеют триггеры и процедуры и чем они отличаются.
ГЛАВА 29. Разработка модулей PSQL.
Хранимые процедуры и триггеры объявляются при помощи операторов CREATE PROCEDURE и CREATE TRIGGER соответственно. Каждый из этих сложных операторов состоит из заголовка и тела.
Элементы процедур и триггеров
Определения модулей PSQL действительно являются одним оператором SQL, который начинается предложением CREATE и завершается терминатором. В определении модуля существует множество элементов: предложений, ключевых слов, блоков множества элементов, программных ветвей, циклов и др. Одни элементы являются обязательными, другие необязательными.
Хотя комплекс объявлений модуля PSQL является оператором DDL, расширения SQL в этом комплексе являются элементами структурированного языка высокого уровня, который имеет особые правила. Одним из этих правил, которое вы должны знать до начала работы, является использование терминатора оператора.
Оператор 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 (Тело) модуля.
Обязательные части затенены.
Элементы заголовка
Имя процедуры или триггера должно быть уникальным в базе данных.
Для триггера:
* ключевое слово 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 и выше
Да
Да
переменная = выражение
Присваивает значение выражения переменной- локальной переменной, входному параметру или выходному параметру
Да
Да
/* текст комментария */
- Delphi. Учимся на примерах - Сергей Парижский - Программирование
- Сделай видеоигру один и не свихнись - Слава Грис - Программирование / Руководства
- Психбольница в руках пациентов - Алан Купер - Программирование