2012/9/25 Hélio Oliveira <[email protected]>
> Boa tarde Colegas!
>
> Como estou iniciando com o PG e mesmo já tendo verificado na documentação
> não vi nenhum exemplo que pudesse me dar um norte. Tenho algumas Stored
> Procedures que retornam valores que é o caso das Functions do PG. Vou
> colocar um exemplo abaixo e peço aos colegas que me digam como posso
> replicar isto no PG.
>
> No Firebird fica assim:
>
> Create or alter procedure FFinanceira (
> mat integer,
> ano integer)
> returns (
> matricula integer,
> nome varchar(50),
> cargo varchar(50),
> out_mes integer,
> out_ano integer,
> evento numeric(12,2),
> nome_evento varchar(50),
> referencia numeric(6,2),
> valor numeric(12,2),
> vencimentos numeric(12,2),
> descontos numeric(12,2),
> liquido numeric(12,2))
> as
> begin
> for select v.matricula,
> v.mes,
> v.ano,
> v.cod_evento,
> e.nome
> v.referencia,
> v.valor
> from variavel v
> join evento e on (e.codigo = v.cod_evento)
> where v.ano = :ano
> and v.matricula = :mat
> into :matricula, :out_mes, :out_ano, :evento, :nome_evento,
> :referencia, :valor do
> begin
> select sum(v.valor)
> from variavel v
> join evento e on (e.codigo = v.cod_evento and
> e.provento_desconto
> = 'P')
> where v.mes = :out_mes
> and v.ano = :out_ano
> and v.matricula = :matricula into :vencimentos
> .........
> suspend;
> end
> end;
>
> ....... para não ficar muito grande o exemplo, apenas para ilustrar pois
> dentro do begin/end do for select efetuarei varias operações.
> Vejam que as variaveis (retuns()) serão o meu retorno e isto irá me
> retornar
> um dataset... sei que no PG podemos utilizar o tipo Query só não sei como
> processar essas operações.
>
> Como ficaria esta SP no PG?
>
>
Fica mais ou menos assim:
CREATE OR REPLACE FUNCTION FFinanceira (mat integer, ano integer)
returns table (
matricula integer,
nome varchar(50),
cargo varchar(50),
out_mes integer,
out_ano integer,
evento numeric(12,2),
nome_evento varchar(50),
referencia numeric(6,2),
valor numeric(12,2),
vencimentos numeric(12,2),
descontos numeric(12,2),
liquido numeric(12,2))
AS $$
BEGIN
FOR matricula, out_mes, out_ano, evento, nome_evento, referencia,
valor do
IN select v.matricula,
v.mes,
v.ano,
v.cod_evento,
e.nome
v.referencia,
v.valor
from variavel v
join evento e on (e.codigo = v.cod_evento)
where v.ano = ano
and v.matricula = mat
LOOP
select sum(v.valor)
into vencimentos
from variavel v
join evento e on (e.codigo = v.cod_evento and
e.provento_desconto
= 'P')
where v.mes = out_mes
and v.ano = out_ano
and v.matricula = matricula
.........
RETURN NEXT;
END LOOP;
END;
$$ STABLE LANGUAGE plpgsql;
E não sei o que quis dizer com tipo Query, talvez esteja falando do RETURN
QUERY, mas não parece ser o seu caso.
Atenciosamente,
--
Matheus de Oliveira
Analista de Banco de Dados PostgreSQL
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