Isso mesmo Matheus a variável do pl/pgSQL

 

Segue exemplo do que eu já fiz

 

 

CREATE OR REPLACE FUNCTION ins_bk_nsaldo()

  RETURNS trigger AS

$$

 

DECLARE 

        V_idprocesso1 contacorrenteembarque.idprocesso%type;

        V_nsaldo1 numeric(18,6);

        V_idprocesso2 contacorrenteembarque.idprocesso%type;

        V_nsaldo2 numeric(18,6);

 

c_nsaldo 

CURSOR FOR 

------------------------&&----------------------------------

select 

nsaldoins.idprocesso as idprocesso1,

nsaldoins.nsaldo as nsaldo1,

nsaldoup.idprocesso as idprocesso2,

nsaldoup.nsaldo as nsaldo2

from

(

SELECT 

processo.idprocesso, 

cast (Sum(vritem)as numeric(18,6))AS nsaldo 

FROM   (

---------------------------------------------------------------------

SELECT idprocesso, 

( CASE 

    WHEN inperda = 'S' THEN 'S' 

    WHEN inperda = 'N' THEN 'N' 

    ELSE 'N' 

  END )

inperda, 

vritem 

FROM   contacorrenteembarque 

WHERE  contacorrenteembarque.idfaturamento IS NULL 

AND dtcancelamento IS NULL

---------------------------------------------------------------------

)

embarque 

LEFT OUTER JOIN processo ON ( embarque.idprocesso = processo.idprocesso ) 

WHERE  inperda <> 'S' 

and processo.idprocesso not in (select distinct idprocesso from nsaldo_dw) 

GROUP  BY 

processo.idprocesso

)nsaldoins

-----------------------------------

full join 

(

-----------------------------------

select 

nsaldo.idprocesso,

nsaldo.nsaldo

from

(

SELECT 

processo.idprocesso, 

cast (Sum(vritem)as numeric(18,6))AS nsaldo 

FROM   

(

---------------------------------------------------------------------

SELECT idprocesso, 

(CASE 

  WHEN inperda = 'S' THEN 'S' 

  WHEN inperda = 'N' THEN 'N' 

  ELSE 'N' 

END)inperda, 

vritem 

FROM   contacorrenteembarque 

WHERE  contacorrenteembarque.idfaturamento IS NULL 

AND dtcancelamento IS NULL

---------------------------------------------------------------------

)

embarque 

LEFT OUTER JOIN processo ON ( embarque.idprocesso = processo.idprocesso ) 

WHERE  inperda <> 'S' 

GROUP  BY 

processo.idprocesso

) nsaldo

full join nsaldo_dw on (nsaldo_dw.idprocesso = nsaldo.idprocesso)

where nsaldo_dw.nsaldo <> nsaldo.nsaldo

)nsaldoup on (nsaldoup.idprocesso = nsaldoins.idprocesso);

-------------------------&&---------------------------------

                                                               

BEGIN 

 

  OPEN c_nsaldo; 

  loop 

  FETCH c_nsaldo 

  INTO  

        V_idprocesso1,

        V_nsaldo1,

        V_idprocesso2,

        V_nsaldo2

        ; 

   

  EXIT WHEN NOT found; 

 

 

if (tg_op = 'INSERT') then

 

  INSERT INTO nsaldo_dw 

  (idprocesso, nsaldo) 

  VALUES 

  (V_idprocesso1, V_nsaldo1);

  RETURN NEW;

  

 elsif (tg_op = 'UPDATE') then

 update nsaldo_dw

set nsaldo = v_nsaldo2

where idprocesso = new.idprocesso;

   RETURN NEW;

   

  end if;   

   END LOOP;

    CLOSE c_nsaldo;

          

if (tg_op = 'DELETE') then 

  delete from nsaldo_dw where idprocesso = OLD.idprocesso;

  RETURN NEW;

      end if;    

       return null;

        END;

$$ language plpgsql;

 

 

 

De: pgbr-geral [mailto:[email protected]] Em nome de 
Matheus de Oliveira
Enviada em: terça-feira, 16 de junho de 2015 09:02
Para: Comunidade PostgreSQL Brasileira
Assunto: Re: [pgbr-geral] tg_op

 

 

2015-06-16 8:42 GMT-03:00 Matheus Ferreira <[email protected]>:

Como usar tg_op num cursor... alguém tem algum exemplo de funções dml com tg_op 
no cursor?

 

hein? Do que você se refere? Único TG_OP que me vem à cabeça é a variável 
especial PL/pgSQL em funções gatilho [1].


[1] 
http://www.postgresql.org/docs/current/static/plpgsql-trigger.html#PLPGSQL-DML-TRIGGER

Atenciosamente,

-- 

Matheus de Oliveira



_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a