Em 04-04-2013 09:52, Irineu escreveu:
REATE OR REPLACE FUNCTION senda.movimentos_baixa()
   RETURNS trigger AS
$BODY$
DECLARE
   vGravarFabrica BOOLEAN DEFAULT EXISTS(SELECT valor FROM
senda.ind_03_03_01_01 WHERE parametro = 'informa_fabrica_baixa' AND
valor = 'sim');
   BEGIN

    IF TG_RELNAME = 'ind_03_03_02_02_a1' THEN

     IF EXISTS(SELECT a.id FROM senda.ind_03_03_02_02_a1 a WHERE
a.id_movimento = NEW.id_movimento) THEN
      RETURN NULL;
     END IF;

     NEW.remessa   := (SELECT remessa FROM senda.ind_03_03_02_02 WHERE
id = NEW.id_movimento);
     NEW.cod_op    := (SELECT cod_op  FROM senda.ind_03_03_02_02 WHERE
id = NEW.id_movimento);
     IF (NEW.cod_celula IS NOT NULL) AND EXISTS(SELECT cod_segmento FROM
senda.cad_01_02 WHERE cod_segmento = 2) THEN
      NEW.cod_turno:=  (SELECT a.codigo FROM senda.ind_03_01_06 a WHERE
a.desabil <> 'T'
                        AND CASE WHEN a.hora_inicial < a.hora_final THEN
(a.hora_inicial <= CURRENT_TIME AND a.hora_final >= CURRENT_TIME)
                            ELSE ((CURRENT_TIME BETWEEN a.hora_inicial
AND CAST('23:59' AS TIME) AND a.hora_inicial <= CURRENT_TIME) OR
                                  (CURRENT_TIME BETWEEN CAST('00:00' AS
TIME) AND a.hora_final AND a.hora_final >= CURRENT_TIME))
                            END LIMIT 1);
     END IF;

    ELSEIF TG_RELNAME = 'ind_03_03_02_02_a2' THEN
     NEW.remessa := (SELECT remessa FROM senda.ind_03_03_02_02 WHERE id
= NEW.id_mov);
     NEW.cod_op  := (SELECT cod_op  FROM senda.ind_03_03_02_02 WHERE id
= NEW.id_mov);
    END IF;

   IF vGravarFabrica THEN
     NEW.cod_fabrica:=COALESCE(NEW.cod_fabrica,(SELECT a.cod_fabrica
FROM senda.ind_03_03_01_03 a WHERE a.codigo =  NEW.remessa));
   ELSE
     NEW.cod_fabrica:=(SELECT a.cod_fabrica FROM senda.ind_03_03_01_03 a
WHERE a.codigo =  NEW.remessa);
   END IF;

   RETURN NEW;
END;
$BODY$
   LANGUAGE plpgsql VOLATILE;

Talvez você esteja com uma questão de concorrência. Verifique se o erro realmente aconteceu na tabela ind_03_03_02_02_a1 e certifique-se disso.

Pergunto: ao inserir, de onde você retira o valor id_movimento (que me parece ser a sua PK ou pelo menos índice único)?

Eu faria um teste, colocando dentro do IF que testa a existência um:
RAISE EXCEPTION
Pra logar o que realmente está acontecendo.
Você pode colocar RAISE EXCEPTION ou RAISE NOTICE em vários pontos da sua função pra tentar "debugar".

O que pode haver é uma transação concorrente comitar o valor antes da sua função terminar, porém após o teste. Isso é possível em caso de isolamento READ COMMITTED.

[]s

__________________________________
Flavio Henrique A. Gurgel
Líder de Projetos Especiais
Consultoria, Projetos & Treinamentos 4LINUX
Tel1: +55-11.2125-4747 ou 2125-4748
www.4linux.com.br
email: [email protected]
______________________________
FREE SOFTWARE SOLUTIONS
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a