Geração de codigos aleatorios não repetitivos.

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Avatar do usuário
gpereira
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 61
Registrado em: Sáb, 10 Dez 2011 10:56 am
Gustavo Antonio Pereira
OCA Oracle Database 10g Administrator Certified Associate

Senhores, Boa Tarde !

Tenho uma duvida, que creio que seja simples porem esta me consumindo . Sera que alguém consegue me ajudar?

Preciso coletar codigos aleatorios gerados atraves do pacote dbms_random, porem preciso de codigos não repetidos.

Para isso, estou executando um for com 60000 loops (for x 1..600000) com geração de codigos aleatorios com inserção linha a linha em determinada tabela. Ocorre que em cada geração faço uma verificação com NOT IN, ou seja, apenas retorna caso numero não esteja na tabela .

Desta forma, cursor retorna valor nulo exibindo erro de sql not found em tela .

Existe alguma forma de burlar este erro, ou seja, caso não encotre linhas execute novamente o loop?

Pensei logicamente em algo com:

IF SQL%NOTFOUND THEN

LOOP

END IF;

(obviamente não funciona) .

Tentei tambem um NLV no campo retornado, ou seja, retorno seria 0 ao invés de nulo, por exemplo. Porem tambem não solucionou o problema.



Segue codigo:


Selecionar tudo

create or replace
PROCEDURE PRC_RANDON_COD as

v_cod number(6);


begin

for x IN 1..60000 loop

select nvl(cod,0) into v_cod from (
                select  nvl(trunc(dbms_random.value(100000, 999999), 0), 0) cod  from dual 
              --  where   nvl(trunc(dbms_random.value(100000, 999999), 0), 0) 
               /* NOT IN (select codigo_card from codigo_card )*/);


--IF v_cod <> 0 then;

INSERT INTO codigo_card(codigo_card) VALUES(v_cod);

--dbms_output.put_line(v_cod);

COMMIT;
-- END IF;

end loop;

END;

Existe alguma alternativa mais facil para resolução deste problema .

Obrigado a todos.
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 321
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Estou no trabalho agora, por isso não testei. Mas apesar de não ter testado o código, analisando rapidamente, aparentemente eu acho que deveria dar
certo.

Caso queira pode tentar utilizar alguns outros recursos desse pacote:


http://psoug.org/reference/dbms_random.html


ou


http://www.devmedia.com.br/numeros-alea ... te-1/20887


Na tentativa de erro e acerto, você poderia tentar fazer a verificação incluindo o valor retornado pela função em uma variável e utilizar essa
variável em uma outra consulta e validar essa consulta. E a partir desta validação você testaria a condição para fazer o insert ou não.

Ainda, não daria certo se você tentasse tratar isso na exception? Caso o erro seja "no_data_found", você executa o seu looping novamente?

Não sei se ficou claro. Espero ter ajudado.
Responder
  • Informação