PostgreSQL - Error de syntaxis en funcion

   
Vista:

Error de syntaxis en funcion

Publicado por Error de syntaxis en funcion (2 intervenciones) el 15/11/2014 18:28:36
Hola, estoy tratando de hacer la siguiente función y que recibe parametros que pueden ser null, y me retorna una tabla como resultado de la consulta, esta es mi función:



CREATE FUNCTION ventasProv(suc int,prov int,prod int,anio int, mes1 int,mes2 int)
RETURNS TABLE (refe text,nom text,ene real,feb real,mar real,abr real,may real,
jun real,jul real,ago real,sep real,oct real,nov real,dic real, tot real) AS
$BODY$
BEGIN
IF $1 IS NULL AND $2 IS NULL AND $3 IS NULL THEN
RETURN QUERY SELECT p.referencia,
p.nombre,
SUM(CASE WHEN extract(month from v.fecha_venta)=1 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=2 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=3 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=4 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=5 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=6 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=7 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=8 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=9 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=10 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=11 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=12 THEN d.cantidad ElSE 0 END),
SUM(d.cantidad)
from venta_prod_serv v inner join det_venta_prod_serv d on v.vtaprsv_id=d.venta_id inner join producto p on d.producto_id=p.id
WHERE (EXTRACT(YEAR FROM v.fecha_venta)=$4 AND EXTRACT(MONTH FROM v.fecha_venta) between $5 and $6)
group by v.sucursal_id,p.proveedor_id,p.referencia,p.nombre
order by p.nombre;
END IF;

IF $1 IS NOT NULL AND $2 IS NOT NULL AND $3 IS NOT NULL THEN
RETURN QUERY SELECT p.referencia,
p.nombre,
SUM(CASE WHEN extract(month from v.fecha_venta)=1 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=2 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=3 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=4 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=5 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=6 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=7 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=8 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=9 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=10 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=11 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=12 THEN d.cantidad ElSE 0 END),
SUM(d.cantidad)
from venta_prod_serv v inner join det_venta_prod_serv d on v.vtaprsv_id=d.venta_id inner join producto p on d.producto_id=p.id
WHERE v.sucursal_id=$1 AND p.proveedor_id=$2 AND d.producto_id=$3
AND (EXTRACT(YEAR FROM v.fecha_venta)=$4 AND EXTRACT(MONTH FROM v.fecha_venta) between $5 and $6)
group by v.sucursal_id,p.proveedor_id,p.referencia,p.nombre
order by p.nombre;
END IF;
IF $1 IS NOT NULL AND $2 IS NOT NULL AND $3 IS NULL THEN
RETURN QUERY SELECT p.referencia,
p.nombre,
SUM(CASE WHEN extract(month from v.fecha_venta)=1 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=2 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=3 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=4 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=5 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=6 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=7 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=8 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=9 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=10 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=11 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=12 THEN d.cantidad ElSE 0 END),
SUM(d.cantidad)
from venta_prod_serv v inner join det_venta_prod_serv d on v.vtaprsv_id=d.venta_id inner join producto p on d.producto_id=p.id
WHERE v.sucursal_id=$1 AND p.proveedor_id=$2
AND (EXTRACT(YEAR FROM v.fecha_venta)=$4 AND EXTRACT(MONTH FROM v.fecha_venta) between $5 and $6)
group by v.sucursal_id,p.proveedor_id,p.referencia,p.nombre
order by p.nombre;
END IF;
IF $1 IS NOT NULL AND $2 IS NULL AND $3 IS NOT NULL THEN
RETURN QUERY SELECT p.referencia,
p.nombre,
SUM(CASE WHEN extract(month from v.fecha_venta)=1 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=2 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=3 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=4 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=5 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=6 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=7 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=8 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=9 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=10 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=11 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=12 THEN d.cantidad ElSE 0 END),
SUM(d.cantidad)
from venta_prod_serv v inner join det_venta_prod_serv d on v.vtaprsv_id=d.venta_id inner join producto p on d.producto_id=p.id
WHERE v.sucursal_id=$1 AND d.producto_id=$3
AND (EXTRACT(YEAR FROM v.fecha_venta)=$4 AND EXTRACT(MONTH FROM v.fecha_venta) between $5 and $6)
group by v.sucursal_id,p.proveedor_id,p.referencia,p.nombre
order by p.nombre;
END IF;
IF $1 IS NULL AND $2 IS NOT NULL AND $3 IS NULL THEN
RETURN QUERY SELECT p.referencia,
p.nombre,
SUM(CASE WHEN extract(month from v.fecha_venta)=1 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=2 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=3 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=4 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=5 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=6 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=7 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=8 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=9 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=10 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=11 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=12 THEN d.cantidad ElSE 0 END),
SUM(d.cantidad)
from venta_prod_serv v inner join det_venta_prod_serv d on v.vtaprsv_id=d.venta_id inner join producto p on d.producto_id=p.id
WHERE p.proveedor_id=$2
AND (EXTRACT(YEAR FROM v.fecha_venta)=$4 AND EXTRACT(MONTH FROM v.fecha_venta) between $5 and $6)
group by v.sucursal_id,p.proveedor_id,p.referencia,p.nombre
order by p.nombre;
END IF;
IF $1 IS NULL AND $2 IS NOT NULL AND $3 IS NOT NULL THEN
RETURN QUERY SELECT p.referencia,
p.nombre,
SUM(CASE WHEN extract(month from v.fecha_venta)=1 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=2 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=3 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=4 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=5 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=6 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=7 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=8 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=9 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=10 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=11 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=12 THEN d.cantidad ElSE 0 END),
SUM(d.cantidad)
from venta_prod_serv v inner join det_venta_prod_serv d on v.vtaprsv_id=d.venta_id inner join producto p on d.producto_id=p.id
WHERE p.proveedor_id=$2 AND d.producto_id=$3
AND (EXTRACT(YEAR FROM v.fecha_venta)=$4 AND EXTRACT(MONTH FROM v.fecha_venta) between $5 and $6)
group by v.sucursal_id,p.proveedor_id,p.referencia,p.nombre
order by p.nombre;
END IF;
IF $1 IS NULL AND $2 IS NULL AND $3 IS NOT NULL THEN
RETURN QUERY SELECT p.referencia,
p.nombre,
SUM(CASE WHEN extract(month from v.fecha_venta)=1 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=2 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=3 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=4 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=5 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=6 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=7 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=8 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=9 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=10 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=11 THEN d.cantidad ElSE 0 END),
SUM(CASE WHEN extract(month from v.fecha_venta)=12 THEN d.cantidad ElSE 0 END),
SUM(d.cantidad)
from venta_prod_serv v inner join det_venta_prod_serv d on v.vtaprsv_id=d.venta_id inner join producto p on d.producto_id=p.id
WHERE d.producto_id=$3
AND (EXTRACT(YEAR FROM v.fecha_venta)=$4 AND EXTRACT(MONTH FROM v.fecha_venta) between $5 and $6)
group by v.sucursal_id,p.proveedor_id,p.referencia,p.nombre
order by p.nombre;
END IF;
END
$BODY$
LANGUAGE 'sql' volatile CALLED ON NULL INPUT;

Me muestra el siguiente error:

********************************************************************************
ERROR: error de sintaxis en o cerca de «IF»
LINE 5: IF $1 IS NULL AND $2 IS NULL AND $3 IS NULL THEN
^

********** Error **********

ERROR: error de sintaxis en o cerca de «IF»
SQL state: 42601
Character: 253
*********************************************************************************

Alguien sabrá a que se debe este error?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Error de syntaxis en funcion

Publicado por martin (48 intervenciones) el 16/11/2014 23:28:00
Por lo pronto veo que te equivocaste de lenguaje en lugar de LANGUAGE 'sql' volatile CALLED ON NULL INPUT
pone LANGUAGE 'plpgsql' volatile CALLED ON NULL INPUT.

seria sql si solo usaras sql,pero como incluis un control de flujo con el if fuera de un select es otra cosa.

SAludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar