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