В InterBase существует два типа хранимых процедур:
1. Процедуры выбора данных – могут использоваться вместо таблиц в операторе SELECT.
2. Выполняемые процедуры – производят какие-либо действия с базой данных и не обязаны возвращать данные. Вызываются с помощью команды EXECUTE PROCEDURE.
Отличие в работе этих двух видов хранимых процедур заключается в том, что процедуры выборки данных обычно возвращают множество наборов выходных параметров, сгруппированных построчно, а выполняемые процедуры могут либо вообще не иметь параметров, либо возвращать только один набор выходных параметров, т.е. одну строку параметров.
Оба типа процедур имеют одинаковый синтаксис создания и формально ничем не отличаются. Любая выполнимая процедура, если она имеет выходные параметры, может быть вызвана в запросе SELECT, любая процедура выбора данных – с помощью EXECUTE PROCEDURE. Разница заключается в цели разработки процедур каждого вида. Процедура выбора данных специально создается для вызова из оператора SELECT, а выполняемая процедура – для вызова оператором EXECUTE PROCEDURE.
|
|
Пример создания процедуры выбора данных:
-- возвращает перечень служащих, работающих в отделе,
-- который передается в качестве входного параметра:
CREATE PROCEDURE Test_Procedure (DeptNo CHAR(3))
RETURNS
(
Number INT, -- порядковый номер
EmpNo SMALLINT, -- идентификатор служащего
FirstName VARCHAR(15), -- имя LastName
VARCHAR(20) -- фамилия
) AS
BEGIN
Number = 0;
FOR
SELECT EMP_NO, FIRST_NAME, LAST_NAME
FROM Employee
WHERE DEPT_NO =:DeptNo
INTO:EmpNo,:FirstName,:LastName
DO
BEGIN
Number = Number + 1;
SUSPEND;
END
END;
Каждая процедура выбора данных должна обязательно содержать оператор SUSPEND, который передает набор выходных параметров в то место, откуда вызвали процедуру.
Пример вызова процедуры выбора данных:
SELECT * FROM Test_Procedure('000');
Пример создания выполняемой процедуры:
CREATE PROCEDURE MakeGenerator (GenName VARCHAR(31),
GenValue INTEGER)
AS
DECLARE VARIABLE Sql VARCHAR(256);
BEGIN
Sql = 'CREATE GENERATOR ' || GenName || ';';
EXECUTE STATEMENT Sql;
Sql = 'SET GENERATOR ' || GenName || ' TO ' ||
CAST(GenValue AS VARCHAR(10)) || ';';
EXECUTE STATEMENT Sql;
END;
Синтаксис оператора вызова процедуры:
EXECUTE PROCEDURE ИмяПроцедуры
[Параметр [, Параметр...]]
[RETURNING_VALUES Параметр [, Параметр...]];
Пример вызова выполняемой процедуры:
EXECUTE PROCEDURE MakeGenerator 'Test_Gen', 1;