Чтение онлайн

на главную - закладки

Жанры

Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ

Борри Хелен

Шрифт:

Тестирование процедур

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

Например, наша процедура LOG SALES прекрасно работает, пока каждая запись продаж имеет непустое значение SALES REP. При этом данный столбец допускает пустое значение. Процедура

генерирует результирующий набор, в котором каждая выходная строка зависит от значений в предшествующих строках. Если мы не учтем возможные эффекты появления значения NULL В таком ключе, наша процедура выдаст неверный результат. Позже в этой главе в разд. "Изменение хранимых процедур" мы добавим меры предосторожности при работе, когда могут появиться некоторые проблемы.

Процедуры для совместного использования

Хотя возможно написание процедуры выбора, которая будет выполнять операции по изменению данных в процессе конструирования выходного набора, этого делать не рекомендуется. Хранимая процедура выбора разрабатывается для вывода набора данных клиенту в контексте вызвавшей ее транзакции. Пока клиентское приложение не завершит использование этого выходного набора, транзакция остается неподтвержденной. Если операции DML включены в код, который генерирует выходной набор, эти запросы DML остаются неподтвержденными, пока транзакция не будет завершена клиентом.

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

Изменение хранимых процедур

Firebird 1.0.x предоставляет два способа изменения хранимых процедур с использованием операторов DDL, a Firebird 1.5 добавляет еще и третий. Это:

* оператор ALTER PROCEDURE, который изменяет определение существующей хранимой процедуры, сохраняя ее взаимозависимости с другими объектами;

* оператор RECREATE PROCEDURE, который выполняется, даже если указанная процедура не существует. Если она существует, то эта версия удаляется, а затем заново создается. Существующие зависимости не сохраняются;

* оператор CREATE OR ALTER PROCEDURE (доступен начиная с версии 1.5) предоставляет лучший вариант. Если процедура существует, применяются правила ALTER, зависимости сохраняются. Если не существует, то будет работать точно так же, как и CREATE PROCEDURE.

Любая из этих операций вызовет исключение, если любая попытка изменений разрушает зависимости.

Влияние на приложения

Внутренние изменения процедуры прозрачны всем клиентским приложениям, использующим эту процедуру. Вам не нужно пересоздавать приложения, если изменения не коснулись интерфейса между вызывающей программой и процедурой - тип, количество или порядок выходных или выходных аргументов.

Синтаксис изменения процедур

За исключением ключевого слова, которое вы выбрали для изменения хранимой процедуры, синтаксис для всех операторов такой же, как и для 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 синтаксис создает новую процедуру, если не существует процедуры с тем же именем, иначе изменяет ее.

Поделиться:
Популярные книги

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Последняя Арена 6

Греков Сергей
6. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 6

По воле короля

Леви Кира
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
По воле короля

Душелов. Том 4

Faded Emory
4. Внутренние демоны
Фантастика:
юмористическая фантастика
ранобэ
фэнтези
фантастика: прочее
хентай
эпическая фантастика
5.00
рейтинг книги
Душелов. Том 4

Темный Лекарь 2

Токсик Саша
2. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 2

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

(Не) моя ДНК

Рымарь Диана
6. Сапфировые истории
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
(Не) моя ДНК

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Измена. Наследник для дракона

Солт Елена
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Измена. Наследник для дракона

Неудержимый. Книга II

Боярский Андрей
2. Неудержимый
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга II

Камень. Книга 4

Минин Станислав
4. Камень
Фантастика:
боевая фантастика
7.77
рейтинг книги
Камень. Книга 4

Измена. Право на сына

Арская Арина
4. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на сына

Инквизитор Тьмы 4

Шмаков Алексей Семенович
4. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы 4

Кротовский, сколько можно?

Парсиев Дмитрий
5. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кротовский, сколько можно?