GERAR NÚMERO ALEATÓRIO DIFERENTE

17/05/2017

0

Bom dia, senhores!

Então... desta vez, venho por meio desta, pedir uma ajuda em relação a geração de números aleatórios. Pesquisei e notei que o mais correto seria criar uma trigger e usar o comando VALUES para casos como esse, entretanto essa geração é um pouco limitada. A situação é a seguinte:

Eu tenho um campo em uma tabela PCPRODUT e eu preciso gerar esse código aleatório automaticamente em um campo chamado CODAUXILIAR, toda vez que for inserida uma nova linha na PCPRODUT. As restrições são que os códigos auxiliares tem que ser sempre diferentes. Não pode gerar um código aleatório que já exista em outra linha, por exemplo. Além disso, eu quero que os códigos tenham sempre 13 caracteres.

No mais, já registro meus agradecimentos.
k.
Kelvin Moreira

Kelvin Moreira

Responder

Post mais votado

18/05/2017

Bom dia,

Ficaria mais ou menos assim:

criação do índice único, certifique-se que de fato não existe duplicidade neste campo antes de criar o índice

Create Unique Index UI01_PCPRODUT On PCPRODUT (CODAUXILIAR);


CREATE OR REPLACE TRIGGER TRG_PCPRODUT_CODAUXILIAR
BEFORE INSERT OR UPDATE ON PCPRODUT
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
--
v_CODAUX NUMBER(13);
v_existe number := 0;
--
BEGIN
--
v_CODAUX := (dbms_random.value(1000000000000,9999999999999));
--
loop
select count(1) into v_existe from PCPRODUT where CODAUXILIAR = v_CODAUX;
--
if v_existe = 0 then
exit;
else
v_CODAUX := (dbms_random.value(1000000000000,9999999999999));
end if;
--
end loop;
--
:new.CODAUXILIAR := v_CODAUX;
--
exception
when others then
dbms_output.put_line(sqlerrm(sqlcode));
end;
/

Roberto Spernega

Roberto Spernega
Responder

Mais Posts

17/05/2017

Roberto Spernega

Bom dia Kelvin,

Para gerar os números aleatórios você pode usar na trigger:

select trunc(dbms_random.value(1000000000000,9000000000000))
from dual;

Mas teria que incluir a vefiricação, ou ter uma unique key neste campo, se violar você gera novamente, num loop.

Acho que o ideal é você criar uma sequence para isso, daí é garantida a unicidade.
Responder

18/05/2017

Kelvin Moreira

Bom dia Kelvin,

Para gerar os números aleatórios você pode usar na trigger:

select trunc(dbms_random.value(1000000000000,9000000000000))
from dual;

Mas teria que incluir a vefiricação, ou ter uma unique key neste campo, se violar você gera novamente, num loop.

Acho que o ideal é você criar uma sequence para isso, daí é garantida a unicidade.


De que forma eu crio essa unique key para ele gerar um novo sempre que já tiver outro igual? E a sintaxe ficará assim?

CREATE OR REPLACE TRIGGER TRG_PCPRODUT_CODAUXILIAR
  AFTER INSERT OR UPDATE ON PCPRODUT
  REFERENCING NEW AS NEW OLD AS OLD
  FOR EACH ROW
DECLARE
CODAUX NUMBER (13);

BEGIN
     IF INSERTING THEN
        CODAUX := (dbms_random.value(1000000000000,9000000000000))
        from dual;
         UPDATE PCPRODUT SET CODAUXILIAR = CODAUX;
     END IF;

     IF UPDATING THEN
         CODAUX := (dbms_random.value(1000000000000,9000000000000))
         from dual;
         UPDATE PCPRODUT SET CODAUXILIAR = CODAUX;
     END IF;
END;
Responder

18/05/2017

Kelvin Moreira

Valeu, meu querido!

Deu certinho.
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar