Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Gofmam

[Resolvido] Triggers - Não atualiza nada

Recommended Posts

Pessoa estou com um problema. Tenho um caso de controle de cinemas. Nele tenho as tabelas DIRETOR (cod_diretor,nome, Media_avaliacao, tot_filmes). Na outra tenho as DIRECOES(1..N) (cod_diretor,cod_filme,avaliacao).

 

Criei uma package direcoes que faz os procedimentos para a multating table.

 

Abaixo as triggers:

 

-- BEFORE STATEMENT

create or replace trigger direcoes_biuds

before insert or update or delete

on direcoes

 

declare

-- local variables here

begin

direcoes_pkg.limpar;

dbms_output.put_line('BIUDS - Vetor inicializado');

end;

 

-- AFTER INSERT UPDATE DELETE ROW

create or replace trigger direcoes_aiudr

after insert or update or delete

on direcoes

for each row

declare

-- local variables here

begin

if (inserting or updating) then-- alimentar vetor

dbms_output.put_line('AIUDR - Alimentando vetor' ||:new.cod_diretor|| ' '||:new.avaliacao );

direcoes_pkg.inserir(:new.cod_diretor, :new.avaliacao);

elsif(deleting) then

if (:old.cod_diretor = :new.cod_diretor) and

(:old.avaliacao = :new.avaliacao) then

direcoes_pkg.inserir(:new.cod_diretor, :new.avaliacao);

end if;

end if;

end;

 

 

-- AFTER INSERT UPDATE DELETE STATEMENT

create or replace trigger direcoes_aiuds

after insert or update or delete

on direcoes

 

declare

-- local variables here

v_cd_diretor diretores.cod_diretor%type;

v_aval diretores.media%type;

v_tot_fil diretores.tot_filmes%type;

i binary_integer;

begin

i := 0;

direcoes_pkg.obter_dados(i,v_cd_diretor,v_aval,v_tot_fil);

dbms_output.put_line('AIUDS - Obtencao de dados ' || v_cd_diretor || ' '||v_aval ||'' || v_tot_fil);

while v_cd_diretor is not null loop

update DIRETORES

set TOT_FILMES = v_tot_fil, MEDIA = v_aval

where COD_DIRETOR = v_cd_diretor;

 

i := i + 1;

direcoes_pkg.obter_dados(i,v_cd_diretor,v_aval,v_tot_fil);

dbms_output.put_line('AIUDS - Atualizou dados ' || v_cd_diretor || ' '||v_aval ||'' || v_tot_fil);

end loop;

exception

when no_data_found then

dbms_output.put_line('AIUDS - Dados nao encontrado');

end;

 

 

Os procedimentos das packages estão OK. O problema esta que nao atualiza os valores na tabela DIRETORES

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

não entendi o motivo de você ter criado três triggers,

que eu mal pergunte, a primeira limpa o quê?

 

você está fazendo a alteração na tabela diretores somento na terceira trigger, correto?

 

pelo que eu me lembro não dá para alterar dados de outras tabelas em trigger,

tente colocar esse comando numa procedure (ou package) e chame a procedure na trigger

Compartilhar este post


Link para o post
Compartilhar em outros sites

A function obter_dados retorna os valores corretos.

 

Já tentou ler a tabela com os valores retornados ?

 

As tabelas estão no mesmo owner ? Pode ser problema de acesso/grant.

 

Alguma constraint é violada ?

 

Altere a última trg

 

...
dbms_output.put_line('AIUDS - Atualizou dados ' || v_cd_diretor || ' '||v_aval ||'' || v_tot_fil);
end loop;
exception
when no_data_found then
dbms_output.put_line('AIUDS - Dados nao encontrado');
when others then
dbms_output.put_line(SQLERRM(SQLCODE)');
end;

Veja se retorna algum erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Conseguir resolver

 

O problema por nao estar atualizando foi que eu so estava obtendo os dados que estava atualizando.

 

Solução foi inserir os codigos no vetor, depois para cada cod fazer um select e atualizar os dados no After Statement

 

Obrigado a todos

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.