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
Sequence
-
- Rank: Analista Júnior
- Mensagens: 82
- Registrado em: Ter, 28 Dez 2010 7:41 pm
- Localização: São Paulo - SP
att. Fabio Ishii
http://ishii.profissionaloracle.com.br
http://ishii.profissionaloracle.com.br
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
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
-
- 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!
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!
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 21 visitantes