Problema com exception DUP_VAL_ON_INDEX

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
pchrys
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Sex, 01 Abr 2011 6:31 pm
Localização: Florianópolis-sc

Oi galera, eu estou tentando tratar

Selecionar tudo

erro ORA-00001: unique constraint  usando DUP_VAL_ON_INDEX
, no caso quando eu mando salvar da esse erro pois o registro (ID) já existe na tabela1 e esta mostrando na tela , acontece que nessa tela eu tenho outros campos que devem ser alterados e são de OUtra tabela2. ai eu faço as alteraçoes e quando mando salvar acontece esse erro. a não ser que na tabela 1 não existam registros e eu esteja inserindo então ele salva normal. mas a partir do momento que ele existe não consigo mais alterar . Por isso tentei usar o

Selecionar tudo

DUP_VAL_ON_INDEX := null
para que ele ignorasse quando fosse tentar duplicar o registro. mas parece que ele ignora minha exception e conitnua dando o erro erro

Selecionar tudo

ORA-00001: unique constraint


alguém tem ideia do que eu posso fazer?
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Olha, Unique Constraints não podem ser violadas e isso é fato.

Se seu registro for novo você deve garantir que ele insira o próximo valr válido. Para isso você deve trabalhar com sua sequencia ou MAX + 1 caso não exista sequencia, para seu campo ID.

Verifique tambem, nas duas tabelas, se apenas o campo ID é Unique, algumas vezes acontece de estar violando outro campo...

Existe alguma restrição sobre separar os campos em blocos diferentes, baseando-se na tabela onde eles tem origem?

Seu bloco em questão é Base Table?

Tente detalhar um pouco mais sua estrutura para que possamos ter uma melhor noção do que pode estar acontecendo...

Qualquer coisa estou por ai...
pchrys
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Sex, 01 Abr 2011 6:31 pm
Localização: Florianópolis-sc

então, esse bloco é base table sim! eu já testei deixando ele como não bd, ai ocorre que quando já existem itens nessa tabela e eu insiro nos outros itens da tela como mencionei ele salva tranquilamente porque não esta tentando violar nada. Mas ai quando ele não tem nada cadastrado e eu TENTo cadastrar ele não salva pois não é base t. e eu não sei como fazer p ele salvar.essa é opção mais logica eu acho. Se precisarem de mais informações. Obrigadaaaaa
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Da um desc em sua tabela e posta para nós, e exemplifique como o Id é gerado(manual ou automaticamente).
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Já pensou em tratar a exceptioon dessa forma:

Selecionar tudo

WHEN DUP_VAL_ON_INDEX THEN
  NULL;
WHEN OTHERS THEN
  MESSAGE('ERRO: '||SQLERRM);
END;
Jeremias
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 23
Registrado em: Seg, 15 Fev 2010 9:58 pm
Localização: São Paulo - SP

Não sei se é o caso ou se poderá fazer isso...

Mas já tive um problema semelhante e resolvi criando uma nova coluna com uma sequence.
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Eu não trataria um erro de integridade de dados com um Null, mas...

O ideal é descobrir o que esta gerando id duplicado.
pchrys
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Sex, 01 Abr 2011 6:31 pm
Localização: Florianópolis-sc

Galera, valeu pela atenção depois de dias lidando com isso (entre outras coisas) minha colega aqui me deu um a luz. Tava acontecendo que esse bloco não tava obedecendo o relacionamento com a outra tabela2 sabe. No caso eu dgitava o ID (tabela1)e ele não mostrava os itens da outra tabela relacionados ao ID... ai eu fiz um MOSTRAR_dados que mostrava o dados da tabela 2.,... mas o que acontecia ao eu mandar salvar (juntamente com os outros registros d tela que eu cadastrei) ele dava a Exception porque como não tava obedecendo o relacionamento ele tentava inserir os dados na tabela2 novamente. Ai então criamos uma trigger no principal when-timed-expired e copiamos parte do codigo que cria no automatico do relacionamento(on_populate_details_ e forçamos a obedecer o relacionamento ai TCHANAM funcionou!!!

Selecionar tudo

declare
 rel_id      Relation;
begin
	 IF ( (:CONVENIADO.ID_PESSOAJURIDICA is not null) ) THEN   
    rel_id := Find_Relation('CONVENIADO.CONVENIADO_TIPO_CONVENIO_HOSP');   
    Query_Master_Details(rel_id, 'TIPO_CONVENIO_HOSP');   
	 END IF;
	 go_item('TP_CONVENIADO');
end;
e no when-validate do ID:

Selecionar tudo

declare
	id_timer timer;
begin
id_timer := create_timer('RELACAO',1,NO_REPEAT);
end;
vou deixar aqui caso possa ajudar mais alguém!!! valewwww
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Majestic-12 [Bot] e 7 visitantes