Fórum GERAR NÚMERO ALEATÓRIO DIFERENTE #581456
17/05/2017
0
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
Curtir tópico
+ 0Post mais votado
18/05/2017
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
Gostei + 1
Mais Posts
17/05/2017
Roberto Spernega
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.
Gostei + 0
18/05/2017
Kelvin Moreira
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;Gostei + 0
18/05/2017
Kelvin Moreira
Deu certinho.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)