Trigger Mutante.

Dicas e truques sobre Oracle Reports Builder - modo gráfico ou modo caractere, ascii, arquivo .PRT, etc
Responder
reneanarcizo
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 11 Mar 2010 2:36 pm
Localização: Campinas - SP
Renê Narcizo

PessoAll, boa tarde.

Sei que já existem alguns tópicos sobre o assunto, mas infelizmente não consegui aplicar o que li... :(

Tenho uma tabela que dentre os campos possui um campo chamado NUFIN, outro que é o NUMNOTA e um outro chamado CODTIPOPER, preciso de algo que verifique se o CODTIPOPER é 1611, e se sim, copie o NUFIN para o NUMNOTA.

Tentei criar uma trigger que fizesse isso, mas recebo o erro de trigger mutante, segue abaixo essa trigger:

Selecionar tudo

CREATE OR REPLACE TRIGGER TRG_UPD_TGFFIN_TRD_ND
before INSERT ON TGFFIN  
Referencing
New As New
Old AS Old
For Each Row
Declare
  Pragma Autonomous_Transaction;
BEGIN  
  IF :NEW.CODTIPOPER IN (1611) THEN
    :NEW.NUMNOTA := :NEW.NUFIN;
  END IF;
END;

Como recebi a mensagem de erro, tentei criar uma outra tabela, gravar nela os números que preciso e depois fazer o update na TGFFIN, mas tb recebo erro, abaixo as triggers.

Selecionar tudo

CREATE OR REPLACE TRIGGER TRG_UPD_TGFFIN_TRD_ND
AFTER INSERT ON TGFFIN  
Referencing
New As New
Old AS Old
For Each Row
Declare
  NUMERO1 NUMBER;
  NUMERO2 NUMBER;
BEGIN
  NUMERO1 := :NEW.NUFIN;
  NUMERO2 := :NEW.NUFIN;  
  IF :NEW.CODTIPOPER IN (1611) THEN
   INSERT INTO CONTROLE_ND_TW VALUES (NUMERO1, NUMERO2);
  END IF;
END;

Selecionar tudo

CREATE OR REPLACE TRIGGER TRG_UPD_CONTND_TRD_ND
AFTER INSERT ON CONTROLE_ND_TW  
Referencing
New As New
Old AS Old
For Each Row
Declare
  NUMERO1 NUMBER;
  NUMERO2 NUMBER;
BEGIN
  NUMERO1 := :NEW.NOVA_ND;
  NUMERO2 := :NEW.NUM_UNICO;
  UPDATE TGFFIN SET NUMNOTA = NUMERO1 WHERE NUFIN = NUMERO2;
END;
Alguém teria mais alguma dica???

Desde já agradeço.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

reneanarcizo,

Eu criei o exemplo abaixo em uma base ORACLE XE 10G e não detectei o problema que você está relatando.
Usei exatamente o código de sua primeira trigger.
Note que a trigger é disparada, pois os resultados do SELECT não correspondem aos INSERTs originais.

Selecionar tudo

SQL> CREATE TABLE TGFFIN
  2  (  CODTIPOPER NUMBER,
  3    NUMNOTA    NUMBER,
  4    NUFIN      NUMBER);

Tabela criada.

SQL> CREATE OR REPLACE TRIGGER TRG_UPD_TGFFIN_TRD_ND
  2  before INSERT ON TGFFIN
  3  Referencing
  4  New As New
  5  Old AS Old
  6  For Each Row
  7  Declare
  8    Pragma Autonomous_Transaction;
  9  BEGIN
 10    IF :NEW.CODTIPOPER IN (1611) THEN
 11      :NEW.NUMNOTA := :NEW.NUFIN;
 12    END IF;
 13  END;
 14  /

Gatilho criado.

SQL> INSERT INTO TGFFIN VALUES (1,1,1);

1 linha criada.

SQL> INSERT INTO TGFFIN VALUES (1611,1,1);

1 linha criada.

SQL> INSERT INTO TGFFIN VALUES (1611,1,2);

1 linha criada.

SQL> INSERT INTO TGFFIN VALUES (1611,1,4);

1 linha criada.

SQL> SELECT * FROM TGFFIN;

CODTIPOPER    NUMNOTA      NUFIN
---------- ---------- ----------
         1          1          1
      1611          1          1
      1611          2          2
      1611          4          4

SQL>
Seria possível você repetir o exemplo acima em seu ambiente? Qual seria a versão exata do seu ORACLE?

Abraços,

Sergio Coutinho
Responder
  • Informação
  • Quem está online

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