Хранимые процедуры могут быть вызваны из приложений с использованием динамических операторов SQL. Они также могут быть вызваны интерактивно из isql и из многих других инструментов работы с базами данных, рекомендованных для использования с Firebird. Исполняемые модули, включая вложенные процедуры, могут быть использованы в скриптах с тем ограничением, что все входные параметры являются константами и не существует выходных наборов. В скриптах не существует возможности передавать переменные параметры.
Выполняемые хранимые процедуры
Процедуры, которые вызываются с помощью оператора EXECUTE PROCEDURE, могут возвращать одну строку из одного или более выходных значений. Они часто используются для выполнения операций добавления, изменения или удаления или для запуска набора операций, таких как пакетный импорт или экспорт данных.
Хранимые процедуры выбора
Хранимые процедуры выбора названы так, потому что они написаны с использованием некоторых специальных расширений языка для создания многострочных выходных наборов, возвращающихся вызвавшей программе, которая использовала запрос SELECT - "виртуальные таблицы".
Сервер не различает процедуры выбора и выполняемые процедуры. Если требуется, он попытается выбрать набор записей из выполняемой процедуры или выполнить что-нибудь в процедуре выбора- и, естественно, будет вызывать исключение, если возникнут ошибки в запросе! Это ваша задача убедиться, что ваш код на сервере делает именно то, что вы от него ожидали, и что код приложения посылает соответствующие запросы.
Создание хранимых процедур
В вашем скрипте или в isql начните с установки символа терминатора, который будет использован для отметки конца синтаксиса CREATE PROCEDURE. Следующий пример устанавливает символ терминатора в &:
SET TERM &;
Синтаксис оператора:
CREATE PROCEDURE имя-процедуры
[(аргумент тип-данных [, аргумент тип-данных [...]])]
[RETURNS (аргумент тип-данных [, аргумент тип-данных [...]])
AS
< тело -процедуры>
<тело-процедуры> =
[DECLARE [VARIABLE] переменная тип-данных;
[...]]]
BEGIN
<составной-оператор>;
END <терминатор>
Элементы заголовка
Объявляйте в заголовке:
* имя процедуры, которое обязательно и должно быть уникальным в базе данных, например:
CREATE PROCEDURE MyProc
* любые необязательные входные параметры (аргументы), требуемые в процедуре, с их типами данных. Список заключается в скобки, параметры отделяются друг от друга запятыми, например:
CREATE PROCEDURE MyProc (invarl integer, invar2 date)
* имя каждого аргумента должно быть уникальным в процедуре. Тип данных может быть любым стандартным типом данных SQL за исключением массива типов
данных. Не требуется соответствия имен входных аргументов именам параметров в вызывающей программе;
* любые необязательные выходные параметры (аргументы), требуемые в процедуре, с их типами данных. Список следует за ключевым словом RETURNS. список заключается в скобки, параметры отделяются друг от друга запятыми, например:
CREATE PROCEDURE MyProc
(invar1 INTEGER, invar2 DATE)
RETURNS (outvar1 INTEGER, outvar2 VARCHAR(20), outvar3 DOUBLE PRECISION)
* имя каждого аргумента должно быть уникальным в процедуре. Тип данных может быть любым стандартным типом данных SQL за исключением массива типов данных;
* ключевое слово AS, которое обязательно:
CREATE PROCEDURE MyProc
(invar1INTEGER, invar2 DATE)
RETURNS(outvar1 INTEGER, outvar2 VARCFAR(20), outvar3 DOUBLE
PRECISION)
AS
Элементы тела
Синтаксис:
< тело-процедуры> = [<список-объявлений-переменных>] <составной-оператор>
Если вам нужно объявить локальные переменные, то это следует сделать далее. Каждое объявление завершается точкой с запятой. В версии 1.5 переменные при их объявлении могут инициализироваться. Синтаксис:
<список-объявлений-переменных> =
DECLARE [VARIABLE] переменная тип-данных [{'=' | DEFAULT} значение];
[DECLARE [VARIABLE] переменная тип-данных; . . .]
Пример:
CREATE PROCEDURE MyProc (
invar1 INTEGER,
invar2 DATE)
RETURNS (
outvar1 INTEGER,
outvar2 VARCHAR(20),
outvar3 DOUBLE PRECISION)
AS
DECLARE VARIABLE localvar integer DEFAULT 0;
DECLARE VARIABLE anothervar DOUBLE PRECISION = 0.00;
! ! !
ПРИМЕЧАНИЕ. Ключевое слово VARIABLE необязательно в версии 1.5 и выше.
. ! .
Следом идет главный блок кода, обозначенный в описании синтаксиса как <составной-оператор>. Он начинается ключевым словом BEGIN и заканчивается ключевым словом END.
Синтаксис:
<составной-оператор> =
BEGIN
<составной-оператор>
[<составной-оператор> ...]
END <терминатор>
Все структуры <составной-оператор> состоят из одного оператора и/или других структур <составной-оператор>, которые могут включать другие вложенные структуры, например:
CREATE PROCEDURE MyProc (
invar1 INTEGER,
invar2 DATE)
RETURNS (
outvar1 INTEGER,
outvar2 VARCHAR(20),
outvar3 DOUBLE PRECISION)
AS
DECLARE VARIABLE localvar integer DEFAULT 0;
DECLARE VARIABLE anothervar DOUBLE PRECISION = 0.00;
BEGIN
< составной-оператор>
END &