[firebase-br] Auto incremento FB

Tecnobyte Informática temp2 em tecnobyte.com.br
Ter Maio 10 08:50:28 -03 2011


Bom dia

No Firebird não existe campo do tipo autoincremental, como existem em outros 
bancos de dados, mas existe um recurso chamado GENERATOR (SEQUENCE em 
Ansi-SQL) que serve para criar contadores. Estes contadores podem ser usados 
para qualquer finalidade onde se quer que um número seja incrementado sem 
risco de repetição, como é o caso de uma chave-primária. Não existe nada no 
Firebird que ligue um campo diretamente ao contador, mas você pode fazer 
isto de diversas formas (via trigger, aplicação, etc.).


COMO CRIAR UM GENERATOR (SEQUENCE)?

Sintaxe:

CREATE GENERATOR NomeDoGerador;
ou
CREATE SEQUENCE NomeDaSequencia;

Exemplos:

CREATE GENERATOR Gen_Venda_Id;
CREATE SEQUENCE SQ_Venda_Id;

Note que para o Firebird, generator e sequence são a mesma coisa. A única 
diferença é que sequence segue o padrão Ansi-SQL, enquanto que generator é 
um recurso antigo do Firebird/Interbase e não está previsto no Ansi-SQL.


COMO OBTER O VALOR DE UM GENERATOR?

Sintaxe:

GEN_ID(NomeDoGerador, Incremento)

Exemplos:

SELECT GEN_ID(Gen_Venda_Id, 1) FROM RDB$DATABASE; -- Obtém o próximo valor 
do gerador.
SELECT GEN_ID(Gen_Venda_Id, 0) FROM RDB$DATABASE; -- Obtém o valor corrente 
do gerador.
SELECT NEXT VALUE FOR Gen_Venda_Id FROM RDB$DATABASE; -- Obtém o próximo 
valor do gerador.



COMO USAR UM GENERATOR EM UM TRIGGER?

Crie um trigger do tipo BEFORE INSERT e nele verifique se o campo chave está 
vazio. Se estiver vazio, preencha com o próximo valor do generator.

Exemplo:

SET TERM ^ ;
CREATE TRIGGER Trig_Venda_AntesInclusao FOR Venda BEFORE INSERT AS
BEGIN
  IF (NEW.Id IS NULL) THEN
    NEW.Id = GEN_ID(Gen_Venda_Id, 1);
END^
SET TERM ; ^


COMO USAR UM GENERATOR NO INSERT?

INSERT INTO Venda(Id, Data, Obs)
VALUES(GEN_ID(Gen_Venda_Id, 1), CURRENT_DATE, 'Teste');

Se quiser que o ID seja retornado, use:

INSERT INTO Venda(Id, Data, Obs)
VALUES(GEN_ID(Gen_Venda_Id, 1), CURRENT_DATE, 'Teste')
RETURNING Id;


Há também a opção de pegar o próximo valor do gerador e colocar em uma 
varíavel para posteriormente usá-lo em um comando INSERT (atualmente uso 
desta forma devido a algumas limitações dos componentes de acesso com os 
quais trabalho).

Não há exatamente uma receita pronta de como usar geradores no Firebird, 
pois cada situação requer uma solução diferente. Muitas vezes haverá, 
inclusive, mais de uma solução para o mesmo problema e o desenvolvedor 
deverá fazer uma escolha.

Atenciosamente.

Daniel P. Guimarães
Tecnobyte Informática
www.tecnobyte.com.br

-----Mensagem Original----- 
From: Gilberto Theves
Sent: Tuesday, May 10, 2011 7:21 AM
To: FireBase
Subject: [firebase-br] Auto incremento FB

Pessoal, apesar de ser um assunto já batido, me deixou com muitas
duvidas pois, achei varias "vertentes" de auto incremento no FB porem
todas diferentes e uma mais esquisita que a outra, a principio não
consegui fazer com que nenhuma funcionasse.O que gostaria de pedir  é um
código que realmente funcione e as instruções de como ele funciona,
realmente não entendi se é preciso algo no código da programação (no
caso JSP)  ou é simplesmente SQL.

Desde já agradeço a atenção dispensada

-- 
Atenciosamente,
Gilberto Theves



______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use: 
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa 





Mais detalhes sobre a lista de discussão lista