函数未返回表

时间:2019-07-12 04:56:43

标签: postgresql

即使完成所有计算,该函数也不会返回数据,并且我可以在控制台中看到信息。

如果尝试创建一个记录变量来存储值并为每一行返回下一个。

CREATE OR REPLACE FUNCTION recompra ()
RETURNS TABLE (
anho INTEGER,
cod_cliente INTEGER,
cliente VARCHAR(255),
cantidad INTEGER,
clasificacion VARCHAR(64)
) AS $$
DECLARE
anho INTEGER;
cod_cliente INTEGER;
cliente VARCHAR(255);
cantidad INTEGER;
clasificacion VARCHAR(64);
anhos_anteriores INTEGER;
BEGIN
FOR anho IN (SELECT DISTINCT(EXTRACT(YEAR FROM v.fecha_factura)) as anhos 
    FROM ventas_vehiculos as v
    GROUP BY anhos 
    ORDER BY anhos ASC) LOOP
    BEGIN 
    FOR cod_cliente , cliente IN (SELECT d.cod_cliente, CONCAT(TRIM(d.nombre),' ',TRIM(d.apellido))
                              FROM clientes as d  WHERE estado_cliente <> 'Inactivo' LIMIT 10) LOOP
                -- TRAE LAS VENTAS POR ANHO
    BEGIN
    FOR cantidad IN SELECT COUNT(f.nro_factura) FROM  ventas_vehiculos as f 
                    WHERE f.cliente = cod_cliente
                    AND EXTRACT(YEAR FROM f.fecha_factura) =anho LOOP
                    SELECT COUNT(f.nro_factura) FROM ventas_vehiculos as f 
                    WHERE f.cliente = cod_cliente
                    AND extract(YEAR FROM f.fecha_factura) < anho INTO anhos_anteriores;

                    IF (cantidad >0 AND anhos_anteriores > 1) THEN
                            clasificacion = 'Recompra';
                    ELSIF (cantidad > 0 AND anhos_anteriores = 0) then
                        clasificacion = 'Compra';
                    ELSIF (cantidad =0) THEN
                        clasificacion = 'No compra';

                    RAISE NOTICE '% -- % -- % -- % -- % --', anho,cod_cliente,cliente,cantidad,clasificacion;
                    END IF;

                    END LOOP; --- cierra loop cantidades por anho

                END; -- cierra trae ventas por anho     

            END LOOP;   --- cierra for clientes

        END; -- cierra begin clientes

END LOOP; -- CIERRA FOR ANHOS

END; 
$$ LANGUAGE plpgsql;

预期产量

year   cod_cliente nombre cantidad clasificacion 
2018   1234       Juan    12      compra
2016   3232       pedro    1      recompra 

1 个答案:

答案 0 :(得分:2)

您的代码有很多问题,我将列出我可以立即看到的问题:

  • 您的代码中没有RETURN NEXT语句。要返回的每一行都必须有一个。

  • 您声明与输出参数同名的局部变量,这将导致名称冲突。不要那样做RETURNS TABLE子句中的返回参数已经是 PL / pgSQL变量。

  • 您应使用:=而不是=进行分配。这是受支持的方法,避免了与比较运算符的混淆。