O Firebird possibilita duas formas para executar stored procedures.
execute procedure MyProc(?,?)
Neste exemplo a Stores Procedure espera receber os dados com base nos parâmetros passados. Se os parâmetros são inválidos, nada será retornado
select * from MyProc(?,?)
Neste exemplo a stored procedure espera gerar um result set.
Programas como o Microsoft Excel, Crystal Reports, etc. quando vão executar a stored procedure usam o seguinte
{[? =] Call MyProc (?,?)}.
O driver ODBC do Firebird determina qual tipo de chamada para execução da procedure deve ser feita com base em como a Stored Procedure foi codificada. O ponto-chave para isso é o uso de SUSPEND na definição da Stored Procedure.
Se o código BLR para a stored procedure contiver apenas um SUSPEND como seria o caso de uma Stored Procedure construída da seguinte forma:
create procedure TEST
as
begin
end
Então o driver ODBC irá chamar a procedure da seguinte forma:
execute procedure TEST.
Se o código BLR contiver mais de um SUSPEND como seria o caso desta definição de Stored Procedure:
create procedure "ALL_LANGS"
returns ("CODE" varchar(5),
"GRADE" varchar(5),
"COUNTRY" varchar(15),
"LANG" varchar(15))
as
BEGIN
"LANG" = null;
FOR SELECT job_code, job_grade, job_country FROM job
INTO :code, :grade, :country
DO
BEGIN
FOR SELECT languages FROM show_langs(:code, :grade, :country)
INTO :lang
DO
SUSPEND;
/* Put nice separators between rows */
code = '=====';
grade = '=====';
country = '===============';
lang = '==============';
SUSPEND;
END
END
Então o driver ODBC chamará a procedure da seguinte forma: select * from "ALL_LANGS"
Para mais detalhes sobre isso e para outros tópicos avançados, por favor, olhe nos exemplos.