Melhor maneira de fazer um sequencial

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 325
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Por favor, gostaria de saber como faço para criar um número sequencial consistente, exemplo, pegar o último e maior número de uma sequencia e a partir dele dar continuidade consecutivamente.

A minha dúvida é, se é necessário capturar o último maior valor ou a função nextval já se encarrega disso? Obrigatoriamente preciso criar um SEQUENCE?

Estou fazendo da seguinte forma:

Selecionar tudo


SELECT MAX(RFP.RFP_ID) INTO vSEQ FROM REDE_FASE_PROCESSO RFP; 
 
 INSERT INTO REDE_FASE_PROCESSO RFP (RFP_ID, RFP_DT_FIM)
 VALUES (vSEQ.NEXTVAL, vDATA);

Grato.
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

ou você faz max(coluna)+1
ou cria uma sequence e manipula com curval e nextval
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP

O problema do max(coluna)+1 é que pode gerar repetições caso duas ou mais sessões diferentes façam a consulta no mesmo instante.

No caso da sequence, se uma sessão pega o nextval e não utilizar o valor pra preencher a coluna, este valor se perderá, e ainda depende também do cache da sequence, que poderão ser perdidos janelas de valores ao invés de um único valor.

Se a "consistencia" que você deseja é ter a coluna preenchida com números sequenciados sem pular valores e sem repetições, fica difícil de se fazer isto.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Sequence é o jeito correto de se fazer isso. Usando Select MAX você vai encontrar problemas e erros com inserts simultâneos, pois ambos verão o mesmo valor no select, causando

Selecionar tudo

exception ORA-00001: unique constraint violated.
A sequence, entretanto, não garante que não seja "pulado" um número. Por exemplo: se ocorrer um exception após um insert esse nextval que estaria sendo inserido por aquela transação não pode voltar atrás em caso de rollback. Logo vai ficar um furo na sequence, não há como evitar.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

hehe... foi mal Burga, repeti a mesma coisa, mas só vi depois. Chefe interrompeu a digitação da minha resposta: tem que respeitar a hierarquia. :lol:
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP

Quando o chefe chega não tem jeito... :lol:
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 325
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Obrigado pela ajuda e atenção de todos.

Deixa eu ver se consigo explicar melhor.

A situação é a seguinte eu já possuou registros em uma tabela (inseridos manualmente para testes), gostaria de saber como devo fazer para que meu SEQUENCE inicie a contagem a partir do meu último registro. É possível fazer isso? Além disso, não encontrei em nenhum lugar na web como zerar, reiniciar este contador sequencial, tem como fazer isso?

Grato.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

No comando de create sequence você pode setar o valor para aquele que você quiser: no seu caso veja o valor com o select que você postou e crie a sequence.

Exemplo:

Selecionar tudo

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
Connected as fsitja
 
SQL> 
SQL> create table REDE_FASE_PROCESSO (RFP_ID number(10), RFP_DT_FIM date);
 
Table created
SQL> insert into REDE_FASE_PROCESSO values (1, to_date('01/01/2010', 'DD/MM/YYYY'));
 
1 row inserted
SQL> insert into REDE_FASE_PROCESSO values (3, to_date('01/01/2010', 'DD/MM/YYYY'));
 
1 row inserted
SQL> insert into REDE_FASE_PROCESSO values (4, to_date('01/01/2010', 'DD/MM/YYYY'));
 
1 row inserted
SQL> commit;
 
Commit complete
SQL> create or replace procedure cria_seq_rfp authid current_user is
  2    v_max number;
  3  begin
  4    select max(rfp_id) + 1
  5      into v_max
  6      from rede_fase_processo;
  7  execute immediate 'create sequence sq_rfp_id start with ' || v_max || '
  8                                               increment by 1
  9                                               nocache
 10                                               nocycle';
 11  end;
 12  /
 
Procedure created
SQL> begin
  2    cria_seq_rfp;
  3  end;
  4  /
 
PL/SQL procedure successfully completed
SQL> select sq_rfp_id.nextval from dual;
 
   NEXTVAL
----------
         5
 
SQL> 
Responder
  • Informação