Eu tenho uma tabela com essa estrutura:
ID NAME RANK
10 A 1
11 A 2
12 A 3
13 A 4
14 B 1
15 B 2
Esta tabela é enorme e cerca de 500 linhas são inseridas a cada minuto. Para manter a ordem de cada grupo, por nome, estamos usando um gatilho antes da inserção como o seguinte:
begin
SELECT NVL(MAX(RANK+1),1) INTO RANK FROM tablename
WHERE NAME=:NEW.NAME;
end;
Isso funciona bem, mas às vezes retorna valores incorretos, por exemplo, (14,8,11,4,5) em vez de (1,2,3,4,5). Investigamos nosso código para não atualizarmos essa coluna.
Qual poderia ser o problema? Se esse método de classificação estiver errado, qual é o melhor método para fazer isso?
Respostas:
1 para resposta № 1Como afirmado no meu comentário, não vejo razão para os valores serem mais altos do que o esperado. Então eu não posso realmente responder sua pergunta original.
No entanto, sugiro que você use uma seqüência, comotambém mencionado nos meus comentários acima. É garantido que uma sequência funcione com acesso simultâneo, o que a sua abordagem não é. Para ter, por último, valores consecutivos, você usaria uma função agregada para isso:
select name, row_number() over (partition by name order by seq_no) as rank_no
from tablename;
Você pode criar uma visão, escondendo seq_no e mostrando apenas rank_no. Assim, seu cliente obtém o que eles querem ver.