CREATE TRIGGER "calcComRet"
AFTER INSERT OR UPDATE
ON venda.venda
FOR EACH ROW
EXECUTE PROCEDURE venda.calcularcomissaoretorno();
CREATE OR REPLACE FUNCTION venda.calcularcomissaoretorno()
RETURNS trigger AS
$BODY$DECLARE
vidvenda integer;
vretorno numeric(8,2);
vcomissao_retorno numeric(4,2);
vimposto_servicos numeric(4,2);
vvalorcomissao numeric(8,2);
BEGIN
IF ( TG_OP = 'UPDATE') THEN
IF (NEW.retorno = OLD.retorno) THEN
RETURN NEW;
END IF;
END IF;
vidvenda := NEW.idvenda;
SELECT vnd.retorno FROM venda.venda AS vnd WHERE vnd.idvenda=vidvenda INTO
vretorno;
SELECT valor/100 FROM sistema.imposto WHERE imposto='comissaoretorno' INTO
vcomissao_retorno;
SELECT valor/100 FROM sistema.imposto WHERE imposto='servicos' INTO
vimposto_servicos;
vvalorcomissao := vretorno*(1-vimposto_servicos)*vcomissao_retorno ;
UPDATE venda.venda SET comissaoretorno=vvalorcomissao WHERE idvenda =
vidvenda;
RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
========= O PROBLEMA =========
INSERT INTO venda.venda (idveiculo, idcliente, idvendedor, montante, data,
memo, avista, nparcelas, parcelamento, financiamento, idveiculotroca )
VALUES (181, 106, 3, 40000, '2010-05-24', 'APAGAR', NULL, NULL, NULL, NULL,
NULL)
O retorno é
ERRO: limite da profundidade da pilha foi excedido
HINT: Aumente o parâmetro de configuração "max_stack_depth", após
certificar-se que o limite de profundidade da pilha para a plataforma é
adequado.
CONTEXT: comando SQL "SELECT 1 FROM ONLY "cliente"."cliente" x WHERE
"idcliente" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x"
comando SQL "UPDATE venda.venda SET comissaoretorno= $1 WHERE idvenda = $2
"
PL/pgSQL function "calcularcomissaoretorno" line 31 at SQL statement
comando SQL "UPDATE venda.venda SET comissaoretorno= $1 WHERE idvenda = $2
"
PL/pgSQL function "calcularcomissaoretorno" line 31 at SQL statement
comando SQL "UPDATE venda.venda SET comissaoretorno= $1 WHERE idvenda = $2
"
PL/pgSQL function "calcularcomissaoretorno" line 31 at SQL statement
[ ... ] repete muitas vezes
comando SQL "UPDATE venda.venda SET comissaoretorno= $1 WHERE idvenda = $2
"
PL/pgSQL function "calcularcomissaoretorno" line 31 at SQL statement
comando SQL "UPDATE venda.venda SET comissaoretorno= $1 WHERE idvenda = $2
"
PL/pgSQL function "calcularcomissaoretorno" line 31 at SQL statement
Indicação de entrada :
INSERT INTO venda.venda (idveiculo, idcliente, idvendedor, montante, data,
memo, avista, nparcelas, parcelamento, financiamento, idveiculotroca )
VALUES (181, 106, 3, 40000, '2010-05-24', 'APAGAR', NULL, NULL, NULL, NULL,
NULL)
========== MINHA HIPÓTESE ==========
Quando insiro o registro, o trigger é acionado. O condição inicial TG_OP =
'UPDATE' é falsa então continua calculando a comissão e fazendo um UPDATE na
tabela.
Esse update, por sua vez, chama novamente a minha função porém desta vez ela
entra na condição TG_OP = 'UPDATE' e também OLD.retorno = NEW.retorno pois
esse campo não foi modificado.
No meu entendimento, isso deveria ser suficiente para parar a recursão, mas
vejo que sempre entra na recursão infinita.
O que posso fazer?
--
View this message in context:
http://old.nabble.com/Trigger-entra-em-recurs%C3%A3o-infinita-tp28670004p28670004.html
Sent from the PostgreSQL - Brasil mailing list archive at Nabble.com.
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral