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