Stored Procedures

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.