[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