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

Responder a