- •Виды хранимых процедур в Firebird
- •Пример выполнения практической работы
- •Некоторые дополнительные сведения Использование переменных
- •Управляющие конструкции begin..End
- •Процедуры с входными и выходными параметрами
- •Обработка данных в процедурах
- •Стандартные операторы
- •И еще примеры Процедуры без параметров
- •Процедуры с входными параметрами
- •Использование входных параметров и локальных переменных
- •Процедуры с выходными параметрами
- •Селективные процедуры
- •Вызов процедур из процедур или триггеров
- •Рекурсивные процедуры
- •Особенность вложенных вызовов процедур и рекурсивных процедур
- •Планы процедур и производительность Планы процедур
- •Производительность
- •Контрольные вопросы
Некоторые дополнительные сведения Использование переменных
Переменные необходимо объявлять до их использования, а также указать их тип. В СУБД Firebird нет необходимости добавлять к имени переменной префикс @, а также переменные обязательно должны быть объявлены до тела хранимой процедуры или триггера.
CREATE PROCEDURE my_procedure
AS
DECLARE VARIABLE my_variable int;
BEGIN
my_variable = 5;
END
Управляющие конструкции begin..End
Ключевые слова BEGIN и END могут использоваться для объединения нескольких операторов в один блок, например, при использовании в условном операторе IF.
GOTO
СУБД Firebird не имеет оператора GOTO. В СУБД Firebird используется более удачный механизм управления ошибками - операторWHEN...DO.
Конечно, оператор GOTO может использоваться и для других целей. В таком случае, правильное использование хранимых процедур обычно улучшает дизайн базы данных.
IF
Оператор IF..ELSE в СУБД Firebird имеет ту же семантику, что и в языках программирования, однако синтакс СУБД Firebird требует наличия ключевого слова THEN после условия.
IF (something = 'unknown')
THEN something = 'uuhhh.....';
ELSE something = 'I know! I know!';
CASE
Оператор CASE используется аналогично оператору switch языка C или оператору case языка Pascal для замены одного значения на другое. Обычно в СУБД Firebird 1.0 эту операцию можно эмулировать хранимой процедурой, возвращающей некоторое значение.
/* Выделить оператор CASE. */
CREATE PROCEDURE get_state_name ( state_code char(2) )
RETURNS ( state_name varchar(64) )
AS
BEGIN
IF (state_code = 'CA') THEN state_name = 'California';
ELSE IF (state_code = 'UT') THEN state_name = 'Utah';
ELSE state_name = 'unknown';
END
/* Это процедура-выборка. */
CREATE PROCEDURE list_states
RETURNS (state varchar(64))
AS
DECLARE VARIABLE short_state CHAR(2);
BEGIN
FOR SELECT state FROM authors INTO :short_state DO
BEGIN
EXECUTE PROCEDURE get_state_name :short_state
RETURNING_VALUES :state;
SUSPEND;
END
END
Три замечания по приведенному примеру. Во-первых, перенос является тривиальным. Во-вторых, текст получается довольно ясным. В-третьих, использование хранимой процедуры вносит большую гибкость и простоту внесения изменений логики. Предположим, оператор CASE для поля state встречается в 12 различных процедурах, и был добавлен новый штат, или что Вы неправильно написали название штата... Совершенно ясно, что лучше выполнить указанное преобразование для использования хранимой процедуры.
С версии 1.5 СУБД Firebird полностью поддерживает оператор CASE, поэтому, в принципе, необходимости перехода на использование хранимых процедур нет.
WHILE
Оператор WHILE существует в СУБД Firebird . Не существует операторов BREAK или CONTINUE, но их можно эмулировать при помощи дополнительных конструкций. СУБД Firebird требует наличия ключевого слова DO после условия цикла.
WHILE (i < 3) DO
BEGIN
i = i + 1;
j = j * 2;
END
RETURN
В СУБД Firebird существует оператор EXIT, который передает управление на заключительный END хранимой процедуры. Однако здесь нет скрытой возвращаемой переменной, поэтому, если Вам необходимо вернуть некоторое значение, Вы должны явно объявить возвращаемую переменную в процедуре.
