On Tue, Oct 21, 2014 at 10:58 AM, Hélio <[email protected]> wrote:
> Estou apanhando, pois fui informado que a sintaxe da PLPGSQL era igual ao
> do Pascal e com isto eu não iria jamais advinhar que teria que colocar ';'
> no END antes do ELSE.
Não é igual à do Pascal, tem algumas semelhanças, mas difere em diversos
aspectos.
Na verdade para IF você nem precisa de BEGIN. Os blocos BEGIN/END em
PL/pgSQL servem (1) definição de escopo e (2) tratamento de erros (usando
SAVEPOINTs). No seu caso você não está usando nenhum dos dois, logo não
precisa do BEGIN. Outro ponto é seu ELSE IF, a forma mais simples é usando
a diretiva ELSEIF (ou ELSIF, dá na mesma). Por fim, o nome da variável que
carrega a operação da trigger é TG_OP e não TG. Esses são os pontos que
identifiquei, corrigindo esses seu código ficaria mais ou menos assim:
declare
...
begin
if (TG_OP = 'INSERT') then
if (new.data_pagamento is not null) then
if (new.data_pagamento <= new.data_vencimento) then
if (new.data_pagamento <= new.validade_desconto) then
vlr_total = new.valor - new.desconto;
else
vlr_total = new.valor;
end if;
else
vlr_total = new.valor + new.acrescimo;
end if;
hist = 'Vlr. ref. pagto. do título '||new.numero_titulo;
insert into movimento_caixa (data, descricao, valor, d_c,
documento)
values (new.data_pagamento, :hist, :vlr_total, 'D',
new.numero_titulo);
end if;
elseif (TG_OP = 'UPDATE')
...
end if;
end;
Ah. E faltou um RETURN. Se for uma trigger AFTER pode retornar NULL ou NEW,
tanto faz.
Atenciosamente,
--
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral