GERAR NÚMERO ALEATÓRIO DIFERENTE
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
Post 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
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.
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;
Clique aqui para fazer login e interagir na Comunidade :)