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 0SET GENERATOR GEN_CLIENTE TO 1SET 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