1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Erro em trigger PL/SQL - Oracle

Discussão em 'Programação' iniciada por Mr.Karvalhovsky, 31 de Março de 2009. (Respostas: 5; Visualizações: 2140)

  1. Viva!

    - Imaginem 2 tabelas: Tabela departamentos e Tabela empregados, que estão associados a um departamento;
    - Agora imaginem que sempre que se insere um registo na tabela empregados, um trigger é disparado de modo a actualizar a tabela departamentos, fazendo o update do número total de empregados correspondente ao departamento no qual o novo registo de empregados foi inserido;
    - O erro que dá quando se tenta efectuar um insert na tabela empregado é: "ORA-04091 a tabela empregado está em mutação. O trigger não a pode ler ou modificar"

    - O trigger em questão é este:

    create or replace
    trigger t1
    after insert on empregado
    for each row

    declare
    v_Nemp departamento.total_emp%type;

    Begin
    select count(emp_no) into v_Nemp from empregado where dep_no = :new.dep_no;
    update departamento set total_emp = v_Nemp where dep_no = :new.dep_no;
    end;


    Ainda sou um menino nisto... Onde está o erro? Será que me podem ajudar...?
     
    Última edição: 31 de Março de 2009
  2. Tomb4000

    Tomb4000 Power Member

    em vez de after mete before.
     
  3. Granadafeup

    Granadafeup Power Member

    Acho que se colocar o before precisa de adicionar + 1 ao nº de empregados
     
  4. Fantástico pessoal! Valeu a ajuda! Ao incrementar 1 ao número total de empregados e ao colocar Before em vez de After solucionou a questão...

    Agora o que mais me intriga é o porquê de não funcionar com After. Nesse caso nem seria necessário incrementar nada... Será que me conseguem explicar essa situação? Ou caso seja possível, fazerem uma alteração do código de modo a colocar isso em funcionamento através do After...
     
    Última edição: 1 de Abril de 2009
  5. Tomb4000

    Tomb4000 Power Member

    para utilizares o after, adicionas esta linha no declare:
    PRAGMA AUTONOMOUS_TRANSACTION;
     
  6. Já experimentei isso. Realmente ao declarar PRAGMA AUTONOMOUS_TRANSACTION; e acrescentar um "commit" no final da implementação, não dá erro. Mas o que é facto é que não funciona nada bem com isso. Não me parece que a solução passe por aí, até porque pelo que pude compreender, após uma pesquisa pelo Google, o PRAGMA não é muito recomendável... http://glufke.net/oracle/viewtopic.php?t=1537

    Em todo o caso, o meu muito Obrigado pela ajuda!
     

Partilhar esta Página