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.