Olá a todos, meu nome é Julierme Carvalho gostaria de mostrar nestes pequenos exemplos como lidar com os campos ID no Oracle para ressalvar no Oracle não existe um campo auto-incremento como no Mysql ou SqlServe, campos que os códigos são gerados automaticamente sem a interação do usuário. Os campos ID ou chaves são o que mantém a unicidade e referências entre as tabelas, por isso a necessidade de uma operação automatizada e sem erros, para isso apresento duas soluções uma criar uma função genérica que sempre me retornar o sequencial, ou uma trigger que incremente este valor para mim.
Então vamos criar uma tabela simples;
CREATE TABLE CIDADES
(
CODIGO INTEGER NOT NULL,
NOME VARCHAR2(100 BYTE),
UF CHAR(2 BYTE)
)
Criando um sequencial para esta tabela;
CREATE SEQUENCE SQ_CIDADES
START WITH 1
MAXVALUE 99999999
MINVALUE 1
Trigger: Sendo mais fácil de trabalhar, a trigger incrementa o campo toda a vez que houve um inserção na tabela. Por outro lado deve ser criar uma trigger para cada tabela, e se algum caso precisar deste valor que foi gerado, você tem que dar um SELECT para saber qual o valor que foi gerado, e pode acreditar em algum momento você vai passar por esta situação. Mais simplifica muito a vida do programador e é mais comum de ser usado justamente por não se preocupar mais com este campo.
Código da trigger:
CREATE OR REPLACE TRIGGER ICREMENTA_CIDADES
BEFORE INSERT
ON CIDADES REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
BEGIN
SELECT SQ_CIDADES.NEXTVAL
INTO :NEW.CODIGO
FROM DUAL;
END;
Esta parte é bem simples! Mais lembrando para cada tabela uma trigger!
FUNCTION: O código da função é muito simples, tanto quanto a trigger mais porque trabalhar com a função e não com a trigger? Uma não vai ser preciso criar uma função para cada tabela e sim uma única função genérica para incrementar todas as tabelas com esta necessidade, outro bom caso trabalha-se já com o valor do código em tela não tendo a necessidade de buscar este valor no banco. Mais por outro lado tenho que chamar a função toda a vez que precisar incrementar um campo vou mostra como faço isso Delphi de maneira genérica e muito simples, tornado muito fácil meu trabalho.
Primeiro vamos criar a função
CREATE OR REPLACE FUNCTION FC_GET_GERADOR (NOME_SEQUENCIAL IN VARCHAR2) RETURN INTEGER
IS
SEQUENCIAL INTEGER;
BEGIN
EXECUTE IMMEDIATE 'SELECT '||NOME_SEQUENCIAL||'.NEXTVAL FROM DUAL' INTO SEQUENCIAL;
RETURN SEQUENCIAL;
END;
Como a função funciona? Apenas me pede um nome do sequencial e retorna o valor incrementado de um, Simples assim!
Agora vou mostra como trabalhar com a função no Delphi.
No seu cadastro base cria uma function publica chamada GetID que pede uma string com paramentro e retornado uma string;
O código:
public
{: função para gera o ID}
function GetID(Sequences: string): string;
implementation
function TfrmBaseCad.GetID(Sequences: string): string;
var
qry: TSQLDataSet;
begin
qry := TSQLDataSet.Create(nil);
qry.SQLConnection := Conn;// Conn é conexao com banco de dados
qry.CommandText:=('SELECT FC_GET_GERADOR('+QuotedStr(Sequences)+')as Sequences FROM DUAL');
qry.Open;
Result := qry.FieldByName('Sequences').AsString;
qry.Free;
end;
Pronto depois disso é so chamar a função e passar o nome do sequencial no nosso exemplo
edtCodigo.Text := GetID('SQ_CIDADES');
http://juliermecarvalho.wordpress.com/
Obrigado a todos e até mais.