Quick Tips : Procedure resulta o valor do Generator - Firebird
Veja nesta quick tip, como usar uma procedure que retorno o valor de um Generator na inclusão de um registro.
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
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo