Estou com um problema num retorno de uma fuction no postgres. É uma query dinamica com variáveis de entrada status, vendedor, datas. Quando executo a function ele me retorna o resultado no formato JSON e não em colunas como eu desejo. Os filtros estão corretos, quando filtro pelas variáveis me retorna o resultado esperado, porém em formato JSON. Já revisei toda essa function e não estou encontrando o erro ou solução para que ela me retorne em colunas no formato de tabela. Se alguém me puder me ajudar , desde já agradeço muito.
Segue a function:
--DROP FUNCTION relacional.lista_pedido_site_status_data(varchar,varchar,date,date);
--SELECT relacional.lista_pedido_site_status_data('Gold', NULL,NULL,NULL);
CREATE OR REPLACE FUNCTION relacional.lista_pedido_site_status_data(v_status varchar, v_vendedor varchar,
v_data_venda_ini date, v_data_venda_fim date)
RETURNS TABLE(cliente character varying, status character varying, vendedor character varying, produto character varying, data_venda text,
total numeric)
LANGUAGE plpgsql
AS $function$
/*********************************************/
IF v_data_venda_ini is NOT NULL AND v_data_venda_fim is NOT NULL THEN
select v_data_venda_ini into v_data_venda_ini;
select v_data_venda_fim into v_data_venda_fim;
select ' and v.data between ''' || v_data_venda_ini || ''' and ''' || v_data_venda_fim ||''' '
into v_initial_date;
ELSEIF v_data_venda_ini is NOT NULL AND v_data_venda_fim is NULL THEN
select v_data_venda_ini into v_data_venda_ini;
select ' and v.data = ''' || v_data_venda_ini || ''' '
into v_initial_date;
ELSE v_initial_date = '';
END IF;
/*********************************************/
IF v_vendedor is NOT NULL THEN
select ' and vd.nome = ''' || v_vendedor || ''' '
into v_nvendedor;
ELSE v_nvendedor = '';
END IF;
/*********************************************/
IF v_status is NOT NULL THEN
select ' and c.status = ''' || v_status || ''' '
into v_nstatus;
ELSE v_nstatus = '';
END IF;
/*********************************************/
RETURN QUERY
EXECUTE '
SELECT DISTINCT
c.cliente,
c.status,
vd.nome as vendedor,
p.produto,
to_char(v.data, ''DD/MM/YYYY'') as data_venda,
v.total
FROM relacional.vendas v
inner join relacional.itensvenda it on it.idvenda = v.idvenda
inner join relacional.produtos p on p.idproduto = it.idproduto
inner join relacional.clientes c on c.idcliente = v.idcliente
inner join relacional.vendedores vd on vd.idvendedor = v.idvendedor
WHERE 1=1 '
|| v_initial_date
|| v_nvendedor
|| v_nstatus
|| '
limit 30 ';
END;
$function$
;
Pergunta
ljsantos
Olá boa dia a todos,
Estou com um problema num retorno de uma fuction no postgres. É uma query dinamica com variáveis de entrada status, vendedor, datas. Quando executo a function ele me retorna o resultado no formato JSON e não em colunas como eu desejo. Os filtros estão corretos, quando filtro pelas variáveis me retorna o resultado esperado, porém em formato JSON. Já revisei toda essa function e não estou encontrando o erro ou solução para que ela me retorne em colunas no formato de tabela. Se alguém me puder me ajudar , desde já agradeço muito.
Segue a function:
--DROP FUNCTION relacional.lista_pedido_site_status_data(varchar,varchar,date,date);
--SELECT relacional.lista_pedido_site_status_data('Gold', NULL,NULL,NULL);
CREATE OR REPLACE FUNCTION relacional.lista_pedido_site_status_data(v_status varchar, v_vendedor varchar,
v_data_venda_ini date, v_data_venda_fim date)
RETURNS TABLE(cliente character varying, status character varying, vendedor character varying, produto character varying, data_venda text,
total numeric)
LANGUAGE plpgsql
AS $function$
declare v_initial_date text;
declare v_nvendedor text;
declare v_nstatus text;
BEGIN
/*********************************************/
IF v_data_venda_ini is NOT NULL AND v_data_venda_fim is NOT NULL THEN
select v_data_venda_ini into v_data_venda_ini;
select v_data_venda_fim into v_data_venda_fim;
select ' and v.data between ''' || v_data_venda_ini || ''' and ''' || v_data_venda_fim ||''' '
into v_initial_date;
ELSEIF v_data_venda_ini is NOT NULL AND v_data_venda_fim is NULL THEN
select v_data_venda_ini into v_data_venda_ini;
select ' and v.data = ''' || v_data_venda_ini || ''' '
into v_initial_date;
ELSE v_initial_date = '';
END IF;
/*********************************************/
IF v_vendedor is NOT NULL THEN
select ' and vd.nome = ''' || v_vendedor || ''' '
into v_nvendedor;
ELSE v_nvendedor = '';
END IF;
/*********************************************/
IF v_status is NOT NULL THEN
select ' and c.status = ''' || v_status || ''' '
into v_nstatus;
ELSE v_nstatus = '';
END IF;
/*********************************************/
RETURN QUERY
EXECUTE '
SELECT DISTINCT
c.cliente,
c.status,
vd.nome as vendedor,
p.produto,
to_char(v.data, ''DD/MM/YYYY'') as data_venda,
v.total
FROM relacional.vendas v
inner join relacional.itensvenda it on it.idvenda = v.idvenda
inner join relacional.produtos p on p.idproduto = it.idproduto
inner join relacional.clientes c on c.idcliente = v.idcliente
inner join relacional.vendedores vd on vd.idvendedor = v.idvendedor
WHERE 1=1 '
|| v_initial_date
|| v_nvendedor
|| v_nstatus
|| '
limit 30 ';
END;
$function$
;
O resultado que me retorna é esse:
Link para o comentário
Compartilhar em outros sites
3 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.