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

Responder a