Sequence

DBA Geral (instalação, configuração do banco, scripts do Sql*Plus, shell scripts, batch scripts, etc...)
Responder
Nadia
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Sex, 12 Jan 2007 10:03 am
Localização: São Caetano

Informações do Ambiente:
* Versão do Oracle: 9i
* Sistema Operacional: 2003 server

Tenho um banco no oracle 9i. Utilizo sequence.
As sequences foram criadas conforme abaixo:

CREATE SEQUENCE SEQ_IDENTIFICADOR
MINVALUE 1
MAXVALUE 9999999999999999999999999999
INCREMENT BY 1
START WITH 1
NOCYCLE
NOORDER
NOCACHE
/

Esta sequence alimenta o campo ID da tabela IDENTIFICADOR.

Na minha aplicação eu faço o insert da sequinte forma:

INSERT INTO Identificador ( ID) values ( Seq_Identificador.nextval)

Aleatoriamente eu recebo o seguinte erro:

ORA-00001: restrição exclusiva (TESTE.IDENTIFCIADOR_ID_PK) violada)

Ao consultar a sequence o último valor está menor que o valor do campo ID, gerando o erro acima.

O Oracle não gerencia isto? Onde está o erro?

Att.

Teles
ishii
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 82
Registrado em: Ter, 28 Dez 2010 7:41 pm
Localização: São Paulo - SP

Olá,

Não o Oracle não gerencia, pois entende que o uso da Sequence é uma decisão da camada de programação e pode ser usado para diversas outras coisas que não apenas uma coluna ID. No caso, deve-se ou criar a sequence no valor superior ao ID ou chamar a sequence até que esse valor seja superado (pode ser via código PL mesmo)

[]s Ishii
marcus.kobel
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 45
Registrado em: Qui, 12 Mai 2011 4:54 pm
Localização: Porto Alegre - RS

Exato.
A SEQUENCE é um objeto a parte da tabela, ela não é atrelada a nenhum campo de nenhuma tabela. Quem define quando ela vai passar para o NEXTVAL é você, mas isso NÃO GARANTE que ele não vai dar erro de violação de chave estrangeira.

Algumas medidas que você pode fazer é resetar a SEQUENCE com o maior valor do campo IDENTIFICADOR.ID + 1.

Outra, seria testar antes de inserir um registro novo na tabela, pra ver se já não existe um registro com o ID que você vai inserir. Isso é gambiarra, mas pode ajudar a detectar o caso de existir algum ponto no seu código que também esteja inserindo registros nessa tabela de forma errada (sem usar a SEQUENCE). Vai que alguém está inserindo registros com MAX(ID) e você esteja usando a SEQUENCE. Se isso ocorre, vai ferrar CERTO!

Abraço!
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 21 visitantes