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.
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
+ 0
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;
/
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
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.
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.
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
Clique aqui para fazer login e interagir na Comunidade :)