From: | Juan José Santamaría Flecha <juanjo(dot)santamaria(at)gmail(dot)com> |
---|---|
To: | Fernando Siguenza <fsigu(at)hotmail(dot)com> |
Cc: | "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Ejecutar sql dinamico |
Date: | 2022-05-03 08:11:51 |
Message-ID: | CAC+AXB1RngE-X0xhKXbu3Rzv_4cjcdnVrVFy7PH2ZFou4JPenw@mail.gmail.com |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
On Tue, May 3, 2022 at 5:40 AM Fernando Siguenza <fsigu(at)hotmail(dot)com> wrote:
> 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?
>
Si quieres que la lista sea un parámetro creo que lo más sencillo es
utilizar un ARRAY. El código lo incluyo como ejemplo, no lo he llegado a
probar:
CREATE
OR REPLACE FUNCTION reporte_ventas_grupo (
pgrupo_id INTEGER[]
,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 inselect p.id
,p.nombre
,d.cantidad
,d.preciofrom ventas vinner
JOIN ventasd d on v.id = d.venta_idinner
JOIN productos p ON d.producto_id = p.idinner
JOIN grupos l ON p.grupo_id = l.idwhere v.fecha >=
pfinicio and v.fecha <= pffinand v.esactivo = 1
AND CASE
WHEN pgrupo_id = ''
THEN true
ELSE p.grupo_id =
ANY(pgrupo_id)
END
ORDER BY p.nombre
desclooppproducto: = rventas.nombre;
ptotal: = round(rventas.precio, 2);
pcantidad: = rventas.cantidad;
RETURN NEXT;
END LOOP;
RETURN;
END;
$BODY$;
Y para llamarlo:
select * from
reporte_ventas_test('{11,4,6,8,12}','2021-01-01','2023-01-01');
Un saludo,
Juan José Santamaría Flecha
From | Date | Subject | |
---|---|---|---|
Next Message | Guillermo E. Villanueva | 2022-06-07 17:17:14 | Optimización de consulta |
Previous Message | Fernando Siguenza | 2022-05-03 03:40:42 | Ejecutar sql dinamico |