Книга: Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Синтаксис изменения процедур
Разделы на этой странице:
Синтаксис изменения процедур
За исключением ключевого слова, которое вы выбрали для изменения хранимой процедуры, синтаксис для всех операторов такой же, как и для CREATE PROCEDURE. Как и в любом другом компилируемом или интерпретируемом модуле, не существует способов непосредственного изменения элементов без полного пересоздания всего модуля. Каждая "переделка", независимо от выбранного ключевого слова для задания операции, имеет дело с созданием новой версии исходного кода и нового двоично- кодированного объекта.
Синтаксис:
{CREATE | ALTER | RECREATE | CREATE OR ALTER} PROCEDURE Имя
[(переменная тип-данных [,переменная тип-данных ...])]
[RETURNS (переменная тип-данных [, переменная тип-данных ...])]
AS
тело-процедуры;
ALTER PROCEDURE
В ALTER PROCEDURE имя процедуры должно быть именем существующей процедуры.
Это мягкий способ изменения кода процедуры, потому что если у нее есть зависимости, на которые логически не влияют изменения, то они не будут влиять на структурную часть.
Вообще, не оказывается влияния на зависимости, включающие другие объекты, которые зависят от измененной процедуры. При этом, если изменения хранимой процедуры изменяют определения ее входных и выходных аргументов, нужно будет выполнить RECREATE PROCEDURE для любой другой процедуры, к которой происходит обращение в процессе выполнения.
! ! !
ВНИМАНИЕ! Некоторые версии Firebird 1.0.x обнаруживают ошибку, когда зависимые объекты выдают исключение при перекомпиляции зависимого объекта, даже если изменения не оказывали воздействия на интерфейс между объектами.
. ! .
RECREATE PROCEDURE
Оператор RECREATE PROCEDURE идентичен оператору CREATE PROCEDURE за исключением того, что для существующей процедуры с тем же именем он внутренне выполняет операцию DROP PROCEDURE перед созданием нового двоичного объекта. Имя процедуры не должно существовать.
Вы можете использовать его, как и ALTER PROCEDURE, однако оно не сохраняет существующие зависимости. Операция будет заблокирована, если существуют зависимые объекты (просмотры или другие процедуры, которые ссылаются на данную процедуру).
Процедура не обязательно должна существовать, однако будьте внимательны с чувствительностью к регистру в именах объектов, если при создании процедуры используются идентификаторы, заключенные в апострофы. Предположим, вы создаете следующую процедуру:
CREATE PROCEDURE "Try_Me"
RETURNS (AWORD VARCHAR(10))
AS
BEGIN
AWORD = 'turtle';
END ^
Теперь вы решаете изменить ее с использованием RECREATE PROCEDURE:
RECREATE PROCEDURE Try_Me
RETURNS (AWORD VARCHAR(10))
AS
BEGIN
AWORD = 'Venezuela';
END ^
Исходная процедура с именем, чувствительным к регистру Try_Me, сохраняется неизмененной. "Заново созданная" процедура является новой процедурой с именем, не чувствительным к регистру - TRY_ME.
CREATE OR ALTER PROCEDURE
Новый в версии 1.5 синтаксис создает новую процедуру, если не существует процедуры с тем же именем, иначе изменяет ее.
Исправление процедуры LOG_SALES
Как пример, мы собираемся исправить процедуру LOG_SALES, которая обещает доставить нам неприятности, потому что мы не обратили внимание на пустые значения ключей. Вот блок, который может решить проблемы:
CREATE PROCEDURE LOG_SALES ( . . .
. . .
DO
BEGIN
IF(REP = LASTREP) THEN
/* будет иметь значение false, если оба значения null */
BEGIN
REPTOTAL = REPTOTAL + ORDTOTAL;
REP_NAME = "" ;
END
ELSE
BEGIN
REPTOTAL = ORDTOTAL;
LASTREP = REP;
SELECT FULL_NAME FROM EMPLOYEE
WHERE EMP_NO = :REP
INTO :REP_NAME;
/* вернет null, если переменная REP имеет значение null */
END
. . .
END ^
Мы исправили логику для обработки пустых значений (сгруппированных вместе в конце курсора, потому что набор упорядочен по этому столбцу) и используем операторы CREATE или ALTER для изменения кода:
CREATE OR ALTER PROCEDURE LOG_SALES (...
. . .
DO
BEGIN
* ************ */
IF((REP = LASTREP) OR (LASTREP IS NULL)) THEN
/* ************ */
BEGIN
REPTOTAL = REPTOTAL + ORDTOTAL;
REP_NAME = "" ;
END
ELSE
BEGIN
REPTOTAL = ORDTOTAL;
LASTREP = REP;
/* ************* */
IF (REP IS NOT NULL) THEN
SELECT FULL_NAME FROM EMPLOYEE
WHERE EMP_NO = : REP
INTO :REP_NAME;
ELSE
REP_NAME = ' Onassigned ' ;
/* ************* */
END
. . .
END ^
COMMIT ^
Ошибка "Объект находится в использовании"
Подтверждение изменения вызовет пресловутую ошибку (обсуждавшуюся в предыдущей главе), если какой-нибудь пользователь в настоящий момент использует эту процедуру или любой другой объект, зависящий от нее. Даже если мы уберем это препятствие, новая версия процедуры не станет немедленно доступной в Суперсервере, если старая версия все еще находится в кэше. Все пользователи должны отключиться от базы данных, а когда они снова к ней подключатся, они смогут увидеть новую версию.
В Классическом сервере новая версия будет доступна следующему клиенту, который соединится с базой данных.
- Изменение хранимых процедур
- Синтаксис для изменения триггеров
- Повышение производительности приложений с помощью хранимых процедур
- 1.2. Базовый синтаксис и семантика Ruby
- Увеличение глубины рекурсии процедур и триггеров
- Изменения оптимизатора, направленные на совместимость
- Другие изменения в 7-й версии InterBase
- Вызов хранимых процедур InterBase с использованием стандартного синтаксиса ODBC
- 1.5.1. Синтаксис
- 7.3. Порядок заключения, изменения, расторжения договоров
- Часть III Конструктор речевых модулей для скриптов и стандартов продаж Изменения в продажах и требования к речевым модул...
- Текстовые сообщения процедуры POST