- Este tópico contém 11 respostas, 5 vozes e foi atualizado pela última vez 17 anos, 3 meses atrás por
DanielB.
-
AutorPosts
-
25 de novembro de 2008 às 2:59 pm #83947
triaw
ParticipanteSenhores,
Estou utilizando uma sequence e quando acontece algum problema e o rollback é ativado a sequence gerada não retorna ao valor anterior.
Agora imaginem uma tabela com Primary Key com valores de 1 até 100
e nessa situação o 97 e o 40 houveram rollback.
como fazer para identificar esses 97 e 40 para poder usar para gravar?
ou se alguém tiver uma sugestão também é bem vinda.
Obrigado,
25 de novembro de 2008 às 3:16 pm #83949Leonardo Litz
ParticipanteCara, quando voce faz um nextval na sequence o valor é mudado, mesmo que se dê rollback este valor não irá voltar.
Oque vc pode fazer é o seguinte, faça um select max na chave primaria incrementando + 1 ao valor, nesse caso se houver um rollback o valor não irá mudar.
select nvl(max(id),0) + 1
into v_id
from tb1Vlw Leonardo Litz
25 de novembro de 2008 às 3:23 pm #83950triaw
Participantecara, você realmente entendeu meu problema? eu não vejo a sua solução como viável. poderia me explicar melhor? pq max + 1 sempre estaria incrementando 1 valor ao ultimo registro, o mesmo que a sequence ja faz.
entendeu?
preciso ver quais números foram gerados pela sequences e não utilizados.
25 de novembro de 2008 às 3:29 pm #83952Marcio68Almeida
ParticipanteVamos supor a seguinte situação :
Eu cadastro o item número 1
Você cadastra o item número 2
Outro vem e cadastra o ítem número 3Só que o seu processo sofre rollback…
É natural que fique faltando o item número 2…O que pode ser feito é uma procedure que recupere os números pulados…
25 de novembro de 2008 às 3:35 pm #83953triaw
ParticipanteÉ exatamente isto que estou procurando.
Estou quase chegando a solução de criar uma tabela para me auxiliar nisto, mas não creio que seja a solução mais apropriada para isto.
Alguém tem, ou sabe onde eu posso encontrar uma procedure que faça tal tarefa?
Obrigado
25 de novembro de 2008 às 3:35 pm #83954Anônimo
Olá Pessoal !!!
Em outro momento também pode ocorrer ‘perda’ do número sequencial, esse momento por exemplo é quando se utiliza Cache na sequence.
Caso você deixou um cache de 10 e só utilizou 2 ainda tem 8 no cache, porém, caso a instancia sofrer uma parada repentina os números que estiverem no cache irão ser ‘perdidos’.
Abrax,
Leandro
25 de novembro de 2008 às 3:36 pm #83955Leonardo Litz
ParticipanteExiste um parametro na sequence chamado cache size, esse parametro quando vc faz um nextval ele reserva para sua sessao os proximos numeros contidos até esse cache.
Exemplo
o cache la é 10 se o next number for 10 será reservado até 20 para vc as sequencias.
Se neste meio tempo houver alguém que tambem faca no nextval ele irá reservar + 10 para outra sessao apartir do ponto de corte da sua sessao, ou seja 20 + 10 irá reservar até 30.
Bom, faco o select max + 1 para que seja incrementado sempre ao maior numero da chave primaria um registro, isso fara com que não haja duplicidade nem saltos.
Voce pode colocar essa forma de incrementação em um trigger também.
Sobre voce verificar quais itens foram pulados, voce vai ter que fazer um loop de 0 até o valor atual da sequence, e dentro do loop vc deverá fazer um select verificando se aquele numero esta contido na tabela.
Vlw?
25 de novembro de 2008 às 3:43 pm #83956triaw
ParticipanteO Cache eu não vejo como também poderia ser útil (tá complicado mesmo..rs)
Estou pensando em criar uma tabela auxiliar e quando houver novo registro que chame nextval eu sempre gravar nesta tabela e nextval e no commit eu remover esse cara, ai na próxima inclusão se ja houver algum que houve rollback (eu gravarei na tabela também se o rollback foi executado) eu usarei este número. o que acham? esta é a melhor solução para isto?
Vlwww
25 de novembro de 2008 às 3:45 pm #83957triaw
Participante[quote=”Litz”:1i48o5t5]
Bom, faco o select max + 1 para que seja incrementado sempre ao maior numero da chave primaria um registro, isso fara com que não haja duplicidade nem saltos.
[/quote]
O Max+1 funcionaria igual o sequence, o problema continuaria sendo o mesmo no meu caso.25 de novembro de 2008 às 3:56 pm #83958Leonardo Litz
ParticipanteFaca um loop na tabela de 1 a 100 dentro do loop faca:
for dd 1..100 loop
Select count(*)
into v_existe
from tb
where pk = dd;if(v_existe = 0)then
htp.p(‘Esse numero foi pulado: ‘||dd);
end if;
end loop;Blz?
25 de novembro de 2008 às 4:27 pm #83959triaw
ParticipanteValeu!!! OBrigado. Resolvido
27 de novembro de 2008 às 2:51 am #83988DanielB
Participantelas sequences se utilizan cuando no importa que queden huecos en una tabla
si lo que quieres es no perder números como por ejemplo en la generación de números de facturas lo correcto es utilizar una tabla numerador, cuyo valor se va actualizando en la medida que se van utilizando, efectuando el respectivo lock cuando se toma el numero y se actualiza, liberandolo con el commit, ante una situacion de rollback todo vuelve atras y queda como al principio sin perderse ningun numero -
AutorPosts
- Você deve fazer login para responder a este tópico.