[firebase-br] Codigo vago

Eduardo Bahiense eduardo em icontroller.com.br
Qui Fev 12 22:39:38 -03 2009


Olá Augusto

A melhor maneira de você atender a este requisito brutal é com um método 
igualmente brutal.

Considere ter uma tabela estática com os campos

Atribuido char(1),
Codigo bigint,

Create index atrib01 on atrib (atribuido, codigo);

Agora, popule esta tabela com 1 milhão ou mais de registros, coforme sua 
expextativa de crescimento, com '0' e codigo+1 ('0' significa não atribuído)

Agora, atribua '1' aos códigos já utilizados:

UPDATE ATRIB A SET ATRIBUIDO = '1' WHERE EXISTS(SELECT 1 FROM 
TABELA_COM_CODIGOS WHERE CODIGO=A.CODIGO)

Nesse ponto, você montou sua estrutura brutal, agora tem que mantê-la.

Obter um codigo novo (pseudo código):

DECLARE VARIABLE NEWCODIGO
DECLARE VARIABLE CONSEGUIU

WHILE TRUE DO
   BEGIN
      SELECT FIRST 1 FROM ATRIB WHERE ATRIBUIDO='0' INTO :NEWCODIGO;

      UPDATE ATRIB SET ATRIBUIDO='1' WHERE CODIGO=:NEWCODIGO AND
      ATRIB='0' RETURNING ATRIB INTO :CONSEGUIU;
      -- se alguém já pegou esse código conseguiu será NULL
      IF CONSEGUIU = '1' THEN BREAK;
   END

SUSPEND (RETURN NEWCODIGO)

Lembre que o código acima não é real, mas só um rascunho da idéia


A obtenção disso será extremamente rápida, pois usará índice para achar 
o primeiro código livre, mas você terá que ter mecanismos seguros para 
desmarcar os inutilizados e, talvez, um mecanismo para inserir mais 
registros nessa tabela a cada inclusão, de forma que ela nunca esgote o 
estoque de códigos livres, preferencialmente com tudo em TRIGGERS.

O objetivo da procedure acima é conseguir pegar o primeiro código que se 
conseguir bloquear (atrib='1'), para impedir que dois usuários peguem o 
mesmo código ao mesmo tempo.

Deixe seu código bem comentado para quem for dar manutenção saber que 
foi o melhor que deu para fazer.

Pensei esse mecanismo agora, é só uma tentativa e não algo que eu já 
tenha testado em produção.

HTA, Eduardo


Augusto junior escreveu:
> Tenho um cadastro onde existe um campo char(6) ... esse campo guarda um
> valor numerico com zeros a esquerda..
> 
> 000001
> 000002
> 000003
> 000004.....
> 
> acontece que esse campo o cliente que define o valor do mesmo.... e colocado
> manualmente... e sempre sendo um valor unico...
> 
> agora ele me pediu para ter uma opcao de o sistema informar um numero vago
> ....
> 
> fiz isso usando um contador numerico  que vai incrementando em um looping
> ... e a cada incremento faco a busca usando locate para
> ver se ja existe ou nao ..
> 
> funcionou perfeitamente ... mas a lentidao do locate desanima...
> 
> existe alguma forma de fazer um sql que retorne o primeiro valor vago ?
> 
> Grato
> Augusto
> ______________________________________________
> 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