plpgsql错误:RETURN在函数返回void时没有参数

时间:2013-07-17 11:23:11

标签: sql for-loop syntax plpgsql postgresql-9.2

我正在尝试提取与特定日期相对应的记录数,以及在数据库中的下一个日期没有相应user_id的user_ids。这是我试图完成它的方式(使用plpgsql但不定义函数:

    DO
    $BODY$
    DECLARE
        a date[]:= array(select distinct start_of_period from monthly_rankings where balance_type=2);
        res int[] = '{}';
    BEGIN
        FOR i IN array_lower(a,1) .. array_upper(a,1)-1
        LOOP
            res:=array_append(res,'SELECT COUNT(user_id) from (select user_id from monthly_rankings where start_of_period=a[i] except select user_id from monthly_rankings where start_of_period=a[i+1]) as b');
                    i:=i+1;
            END LOOP;
            RETURN res;
        $BODY$ language plpgsql

我得到一个错误:无法检索结果:ERROR:RETURN在函数返回void时没有参数 第11行:返回res;  我是这种程序语言的新手,无法发现函数返回void的原因。我确实将值赋给变量,并且我声明为空 - 不是NULL - 数组。是否有语法或更重要的推理错误?

1 个答案:

答案 0 :(得分:3)

1。)您不能RETURN语句中的WITH x AS ( SELECT DISTINCT start_of_period ,rank() OVER (ORDER BY start_of_period) AS rn FROM monthly_rankings WHERE balance_type = 2 ) SELECT x.start_of_period, count(*) AS user_ct FROM x JOIN monthly_rankings m USING (start_of_period) WHERE NOT EXISTS ( SELECT 1 FROM x x1 JOIN monthly_rankings m1 USING (start_of_period) WHERE x1.rn = x.rn + 1 -- AND m1.balance_type = 2 -- only with matching criteria? AND m1.user_id = m.user_id ) -- AND balance_type = 2 -- all user_id from these dates? GROUP BY x.start_of_period ORDER BY x.start_of_period 。你必须改为DO

2。)你不需要这些。使用此查询,其速度将提高一个数量级:

start_of_period

这包括最后一个符合条件的{{1}},您可能希望将其排除在plpgsql代码中。