[PostgreSQL-Brasil] Função PL/pgsql e DBLink

Rogério A Bassete rogerio em microwork.inf.br
Sexta Abril 27 11:24:14 UTC 2007


Olá, 

Tenho uma função pra retornar várias linhas e colunas usando o dblink... no primerio For..Select elr retorna corretamente, mas a partir do
segundo como cria a view todas vez e o For..Select retorna somente os dados do primeiro registro, sempre repete esses valores..

Pergunta:
   - Tem como eu fazer o retorno dessa função sem usar views ? A única maneira que encontrei de retornar valores usando o dblink foi atráves de views...
   - Ou tem como corrigir isso ?

Obrigada,

Elisandra




CREATE OR REPLACE FUNCTION relmixvenda(date, date, "varchar", "varchar", "varchar", int4, int4, "varchar", "varchar", "varchar")
 RETURNS SETOF mixvenda AS
$Body$
DECLARE
   Linha mixvenda%rowtype;
   Rec     Record;
   Rec2    Record;
   vSql    varchar;
   vSql2   varchar;
   vFuncao text;
BEGIN

  -- retorna o sql com uso ou não do dblink..se for solicitado mais de uma empresa
  -- monta select usando dblink
  vFuncao := MontaDbLink('Select *** as emp, req.Requisicao, req.CodCli, req.OS, req.Vendedor
                                 ,Coalesce(Sum((ite.Quantidade * ite.Preco_Un) - Round(CAST((ite.Quantidade * ite.Preco_Un * ite.Desconto /100) +
                        ite.Desc_valor AS Numeric(15,2)),2)),0) as vlrTotal
                                 ,Coalesce(Round(Sum(CAST((ite.Quantidade * ite.Preco_Un * ite.Desconto /100) + ite.Desc_valor
                                            AS Numeric(15,2))),2),0) as DescTotal
                          FROM Requisicao req
                                   INNER JOIN ItemReq      ite on ite.Requisicao = req.Requisicao
                               LEFT JOIN  TipoMov      tmv on tmv.TipoMov    = req.TipoMovto
                               LEFT JOIN  Funcionarios fun on fun.CodFunc    = req.Vendedor
                          WHERE ('||quote_literal($3)||' = '''' OR InStr(req.Vendedor,'||quote_literal($3)||''||')<>0)
                            AND (('||quote_Literal($4)||' = ''Faturadas'' and req.ClienteFatura BETWEEN '||$6||' and '||$7||') OR
                                 ('||quote_Literal($4)||' <> ''Faturadas'' and req.CodCli BETWEEN '||$6||' and '||$7||'))
                          GROUP BY req.Requisicao, req.CodCli, req.OS, req.Vendedor',quote_literal($9));

  vSql := 'Create or Replace View View1 as '||vFuncao||';';

  Execute vSql;

  vSql := ''; vFuncao := ''; --limpa variaveis

  FOR Rec IN SELECT * FROM View1 LOOP

     Linha.Empresa          := Rec.Emp;
     Linha.Requisicao     := rec.Requisicao;
     Linha.CodCli          := Rec.CodCli;
     Linha.OS               := Rec.OS;         Linha.Vendedor       := Rec.Vendedor;
     Linha.ValorTotal       := Rec.vlrTotal;
     Linha.ValorDesconto  := Rec.DescTotal;


     IF $10 = 'A' THEN

      vFuncao = montadblink('Select *** as emp, coditem, quantidade, produto, preco_un, desconto
                                   ,desc_valor, custo_medio, diferenca, serie_nf, nf
                             FROM itemreq
                                  LEFT JOIN Produtos p on p.Codigo_Produto = itemreq.Produto
                             WHERE requisicao = '||Rec.Requisicao||' ORDER BY requisicao,produto,sgarantia',quote_literal($9));

      vSql := 'Create or Replace  View View2 as '||vFuncao||';';

      Execute vSql;

      vSql := ''; vFuncao := '';

      FOR Rec2 IN SELECT * FROM View2 LOOP

        Linha.CodItem           := Rec2.CodItem;
        Linha.Quantidade      := Rec2.Quantidade;
        Linha.produto            := Rec2.Produto;   
        Linha.Preco_Un := Coalesce((Rec2.Quantidade * Rec2.Preco_Un) - Round(CAST((Rec2.Quantidade * Rec2.Preco_Un * Rec2.Desconto /100) +
                                        Rec2.Desc_valor AS Numeric(15,2)),2),0);
        Linha.Desconto := Coalesce(Round(CAST((Rec2.Quantidade * Rec2.Preco_Un * Rec2.Desconto /100) + Rec2.Desc_valor AS Numeric(15,2)),2),0);

        RETURN NEXT Linha;

      END LOOP;
     ELSE
        Return Next Linha;
     END IF;
      End LOOP;

 RETURN;

END$Body$
 LANGUAGE 'plpgsql' VOLATILE;



Mais detalhes sobre a lista de discussão Brasil-Usuarios