Ejecutar sql dinamico

From: Fernando Siguenza <fsigu(at)hotmail(dot)com>
To: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Ejecutar sql dinamico
Date: 2022-05-03 03:40:42
Message-ID: BL1PR14MB49184B33F42C2C2E8AEF3C43A1C09@BL1PR14MB4918.namprd14.prod.outlook.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Amigos tengo una duda,
En una funcion recibo algunos parametros para usarlos como filtros, algo asi

CREATE OR REPLACE FUNCTION reporte_ventas_grupo(
pgrupo_id varchar,
pfinicio date,
pffin date,
OUT pproducto character varying,
OUT ptotal numeric,
OUT pcantidad integer)
RETURNS SETOF record
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
ROWS 1000
.......

en el campo grupo id, viene los codigos seleccionados por el usuario de los grupos que desea ver en el reporte mas o menos viene un varchar de esta forma '1,4,6,8,12'

entonces quiero generar un select como este

select p.id,p.nombre,d.cantidad,d.precio
from ventas v
inner join ventasd d on v.id=d.venta_id
inner join productos p on d.producto_id=p.id
inner join grupos l on p.grupo_id=l.id
where v.fecha>=pfinicio and v.fecha<=pffin
and v.esactivo=1
and case when pgrupo_id='' then true else p.grupo_id in (pgrupo_id) end
order by p.nombre desc

Claro el select es un poco mas complicado, la funcion completa esta asi

CREATE OR REPLACE FUNCTION reporte_ventas_grupo(
pgrupo_id varchar,
pfinicio date,
pffin date,
OUT pproducto character varying,
OUT ptotal numeric,
OUT pcantidad integer)
RETURNS SETOF record
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
ROWS 1000

AS $BODY$
DECLARE
rventas record;
vtotal numeric;
vcliente_id bigint;
vvendedor_id bigint;
BEGIN

for rventas in
select p.id,p.nombre,d.cantidad,d.precio
from ventas v
inner join ventasd d on v.id=d.venta_id
inner join productos p on d.producto_id=p.id
inner join grupos l on p.grupo_id=l.id
where v.fecha>=pfinicio and v.fecha<=pffin
and v.esactivo=1
and case when pgrupo_id='' then true else p.grupo_id in (pgrupo_id) end
order by p.nombre desc
loop
pproducto:=rventas.nombre;
ptotal:=round(rventas.precio,2);
pcantidad:=rventas.cantidad;
return next;
end loop;
return;
END;
$BODY$;

pero al ejecutar la funcion me da este error

ERROR: el operador no existe: integer = character varying LINE 8: ... case when pgrupo_id='' then true else p.grupo_id in (pgrupo...

a la funcion la llamo asi

select * from reporte_ventas_test('11,4,6,8,12','2021-01-01','2023-01-01')

Como podria ejecutar el select con el parametro de grupo con varios codigos?

Saludos

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Juan José Santamaría Flecha 2022-05-03 08:11:51 Re: Ejecutar sql dinamico
Previous Message Nahum Castro 2022-04-22 04:44:34 Re: Cálculo de porcentaje de respuesta a correo