Fórum Comando quot;Suspendquot; em StoredProcedure #254391

14/10/2004

0

Olá! Estou usando Firebird 1.5 e algo estranho ocorreu. Há um tempo atrás eu havia feito a seguinte StoredProcedure para subtrair do estoque uma quantidade X de um produto:

DECLARE VARIABLE ATUAL FLOAT;
BEGIN
   SELECT QUANTIDADE FROM PRODUTOS WHERE CODIGO=:PRODUTO INTO :ATUAL;
   NEWQUANT = :ATUAL-:NQUANT;
   UPDATE PRODUTOS SET QUANTIDADE=:NEWQUANT WHERE CODIGO=:PRODUTO;
END


Nessa SP eu não usei o comando Suspend. Hoje fui fazer uma outra SP para gerar um novo código de um generator caso seja necessário:

DECLARE VARIABLE TCODIGO INTEGER;

begin

   SELECT CODSUB FROM NOTAS WHERE DATA=:PDATA AND FORNECEDOR=:PFORNECEDOR INTO :TCODIGO;
   
   IF (TCODIGO > 1) THEN
   BEGIN
      SCODIGO = TCODIGO;
   END
   ELSE
   BEGIN
      INSERT INTO NOTAS (DATA,FORNECEDOR) VALUES (:PDATA,:PCLINICA);
         SELECT CODSUB FROM NOTAS WHERE DATA=:PDATA AND FORNECEDOR=:PFORNECEDOR INTO :SCODIGO;
   END
   
   SUSPEND;

end


O fato que eu não consegui entender é que essa segunda só retorna o valor para ´SCODIGO´ se eu usar esse suspend no final já a primeira sem o suspend retorna o valor. Por que isso acontece?

Até!


Delphi32

Delphi32

Responder

Posts

14/10/2004

Dorivansousa

O Comando SUSPEND suspende a execução do procedure, retornando os valores adequados dos parâmetros de saída. Se o comando SUSPEND ocorre em um executable procedure, ele tem o mesmo efeito de um
comando EXIT, pois o procedure não é retomado. Porém, em um select procedure, a execução é retomada no comando seguinte ao SUSPEND quando o próximo FETCH do SELECT é executado. Atenção para que um
parâmetro de saída que não tenha tido atribuição pode voltar qualquer valor.


Responder

Gostei + 0

14/10/2004

Dorivansousa

olha essa apotila:
http://www.comunidade-firebird.org/modules.php?name=Downloads&d_op=viewdownloaddetails&lid=43&title=Introdução a Stored Procedures e Triggers no Firebird

ou baixe direto:
[url]http://www.comunidade-firebird.org/modules.php?name=Downloads&d_op=getit&lid=43[/url]


Responder

Gostei + 0

14/10/2004

Martins

o SUSPEND serve para informar que os parâmetros de saída devem ser enviados como resposta do procedimento (como um ´registro´) -- deve ser usado apenas em Procedimentos ´selecionáveis´ (procedimentos q podem retornar diversas ´linhas´ e são manipulados semelhantemente à tabelas ou views)


Palavras do Anderson.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar