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:
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;