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

Responder a