Olá galera, nesta Quick Tips, irei mostrar como criar um procedure no FireBird para incluir um registro numa determinada tabela, e além disso retornar o ID gerado, através de um Generator.

 

Mas como fazer uma procedure retornar um valor se este trabalho é feito através de uma function, mas como fazer isso então ? Veremos mais abaixo.

 

O que é um Generator ?

Generator é um mecanismo que temos no Firebird, para gerar valores auto-incremento, como temos no MySQL, e o Identity do SQLServer.

 

Para incrementarmos um Generator usamos uma instrução SQL bem simples, veja a mesma :

 

SELECT GEN_ID(GEN_CLIENTE,1) FROM rdb$database );

SELECT GEN_ID(GEN_FUNCIONARIO,1) FROM rdb$database );

SELECT GEN_ID(GEN_FORNECEDOR,1) FROM rdb$database );

 

Como podemos criar um Generator ?

 

CREATE GENERATOR GEN_CLIENTE;

CREATE GENERATOR GEN_ FUNCIONARIO;

CREATE GENERATOR GEN_ FORNECEDOR;

 

Agora sim vamos a criação da procedure para inclusão de registro que retorne o valor do Generator gerado.

 

-- Vamos levar em consideração que a tabela de cliente só tenha dois

-- campos (IDCliente , Nome)

 

 CREATE PROCEDURE GRAVARCLIENTE (NOME VARCHAR(50))

-- Definimos uma variável de saida para ele
 RETURNS (Result INTEGER)
AS

  -- Vairável para armazenar o valor do Generator

  DECLARE VARIABLE XID INTEGER;
BEGIN

  -- Executamos o comando que faz o Generator incrementar e salvamos

  -- seu valor em XID
  SELECT GEN_ID(GEN_CLIENTE,1) FROM rdb$database  INTO :XID;

-- Comando Insert básico de SQL
  INSERT INTO cliente (IDCLIENTE, NOME)

-- Passamos os valores do Generator e do Parâmetro Nome para a inclusão -- do registro
  VALUES(:XID, :NOME);

-- Retornamos o valor do Generator
 Result = XID;
END

 

Mas qual seria a necessidade de se fazer isso ?

            No momento que executamos um Generator, independente de ser usado na tabela ou não, o valor ser incrementado, caso sua necessidade de não perder nenhum valor, quebrando assim a seqüência, você pode usar esta rotina para evitar este problema.

Imagine se tivéssemos no clique do botão Novo, de uma aplicação feita em Delphi, por exemplo, a execução do Generator e o usuário decidisse cancelar a operação para fazer outra coisa ou até mesmo sair do computador, sua seqüência estaria quebrada neste momento, pois foi gerado um valor não usado.  

Sabemos que tem como alterar o valor de um Generator, sem problemas é bem simples também, veja:

 

SET GENERATOR GEN_CLIENTE TO 0
SET GENERATOR GEN_CLIENTE TO 1
SET GENERATOR GEN_CLIENTE TO 2

Para fazermos isso controlar pela nossa aplicação teríamos um trabalho maior verificar se o Generator esta sendo usado, se estiver voltar para o valor desejado, mas se neste momento um outro usuário pedir um novo Generator ? Será muito pior para a aplicação tratar este tipo e coisa.

 

Fico por aqui ate à próxima Quick Tips.

 

Um abraço

 

Wesley Y

wyamazack@rwsolution.com.br