Erro : ORA-06512 ao executar uma trigger.

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
emer_rosa
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Sáb, 28 Ago 2010 10:45 am
Localização: Torres-RS
Emerson E. Rosa

Opa,

To tentando fazer uma trigger em uma tabela de cabeçalho de Pedidos mais ta ocorrendo o seguinte erro:

ORA-04091: a tabela TGFCAB é mutante; talves o gatilho/função não possa localizá-la ORA-06512: em "SROXO_PENDENTES",line 4
ORA-04088: erro durante a execução do gatilho 'SROXO_PENDENTES'

A função da Trigger é não deixar o usuario marcar um Pedido como não pendente se ele não foi Faturado, a trigger verifica na tabela TGFVAR se tem alguma nota ligada a ele, e se não tiver nenhuma nota fiscal ligada a ele quer dizer que não foi faturado ainda, esta disponivel para faturamento, e verifica também se não é um pedido com corte total, ou seja totalmente sem estoque, que ai pode ser marcado como não pendente sem faturar.

Por engano volta e meia marcam pedidos como não pendente, so encontramos dias depois, com relatorios, gostaria de fazer funcionar essa trigger para impedir isso no ato.

segue trigger:

Selecionar tudo

CREATE OR REPLACE TRIGGER SROXO_PENDENTES
BEFORE UPDATE
ON TGFCAB 
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
WHEN ((NEW.PENDENTE != OLD.PENDENTE) AND (NEW.PENDENTE = 'N'))
DECLARE 
  P_EXISTE   INT := 0;
BEGIN 
SELECT COUNT(1) INTO P_EXISTE FROM TGFCAB CAB
LEFT JOIN (SELECT DISTINCT VAR.NUNOTAORIG FROM TGFCAB CAB
INNER JOIN TGFVAR VAR ON (VAR.NUNOTA = CAB.NUNOTA)
WHERE CAB.SERIENOTA IN ('1','2')) REL ON (REL.NUNOTAORIG = CAB.NUNOTA)
LEFT JOIN (SELECT CAB.NUNOTA
FROM TGFCAB CAB
INNER JOIN (SELECT CAB2.NUNOTA, SUM(ITE.QTDNEG) AS QTDNEG, SUM(ITE.QTDCONFERIDA) AS QTDCONFERIDA FROM TGFITE ITE
INNER JOIN TGFCAB CAB2 ON (CAB2.NUNOTA = ITE.NUNOTA) GROUP BY CAB2.NUNOTA ORDER BY 1)REL ON (REL.NUNOTA = CAB.NUNOTA)
WHERE REL.QTDNEG = REL.QTDCONFERIDA) REL1 ON (REL1.NUNOTA = CAB.NUNOTA)
WHERE CAB.TIPMOV = 'P' AND CAB.PENDENTE = 'N' AND REL.NUNOTAORIG IS NULL AND REL1.NUNOTA IS NULL
AND NOT (CAB.CODPARC IN (90000,90001));
IF (P_EXISTE != 0)  THEN
     RAISE_APPLICATION_ERROR(-20101,'não pode ser marcado como não pendente, pedido não foi faturado !!!!!');
END IF; 
END;
Já tentei trocar para After, to sem ideia, já tentei criar uma View com os campos da TGFCAB que uso neste trigger e rodar a trigger encima da View mais não aceitou compilar essa trigger na View, se alguém tiver uma ideia 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

Oi Emer,

Este é um problema de "tabela mutante", ou seja, você criou uma trigger para uma tabela, e nesta trigger está tentando fazer verificações nesta mesma tabela "onde reside" a trigger.

No forum existem vários tópicos sobre este mesmo assunto. Experimente consultar o tópico abaixo:

http://glufke.net/oracle/viewtopic.php?t=96

Neste tópico, consulte especialmente a metodologia do Tom Kyte (AskTom) para solucionar este problema.

Abraços,

Sergio Coutinho
emer_rosa
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Sáb, 28 Ago 2010 10:45 am
Localização: Torres-RS
Emerson E. Rosa

Oi Sergio,

Valeu, agora entendi o porque do erro, tentei outras formas e ainda não consegui, mais como sei o erro, fica mais facil descobrir, vou tentar lendo melhor os topicos que me passou.

Muito Obrigado.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Dá uma pesquisada aqui no fórum, por: Mutante.

Você irá encontrar links interessantes, como este:

Link Mutante

Qualquer coisa, manda pra gente.[/url]
Responder
  • Informação