plpgsql 错误:RETURN 在返回 void 的函数中不能有参数

问题描述 投票:0回答:2

我正在尝试提取与特定日期和 user_ids 相对应的记录数,这些记录在数据库中没有对应的下一个较晚日期的 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

我收到错误:无法检索结果:错误:RETURN 在返回 void 的函数中不能有参数 第 11 行:返回 res; 我是这种过程语言的新手,无法找出该函数返回 void 的原因。我确实将值分配给变量,并且声明了空数组,而不是 NULL 数组。是否存在语法或更严重的推理错误?

sql for-loop syntax plpgsql postgresql-9.2
2个回答
8
投票

1.) 您根本无法从

RETURN
 语句中
DO
。你必须改为
CREATE FUNCTION

2.) 你不需要这些。使用这个查询,会快一个数量级:

WITH cte AS (
   SELECT DISTINCT start_of_period
        , rank() OVER (ORDER BY start_of_period) AS rn
   FROM   monthly_rankings
   WHERE  balance_type = 2
   )
SELECT c.start_of_period, count(*) AS user_ct
FROM   cte c
JOIN   monthly_rankings m USING (start_of_period)
WHERE  NOT EXISTS (
   SELECT FROM cte c1
   JOIN   monthly_rankings m1 USING (start_of_period)
   WHERE  c1.rn = c.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 c.start_of_period
ORDER  BY c.start_of_period;

这包括最后的排位赛

start_of_period
。您可能想像在 PL/pgSQL 代码中一样排除它。


0
投票

我在下面遇到了同样的错误:

错误:RETURN 在返回 void 的函数中不能有参数
第 5 行:返回 2; ——这里

因为

RETURNS VOID
RETURN 2;
INTEGER
)的类型不一样,如下图:

CREATE FUNCTION addition() RETURNS VOID AS $$
BEGIN                            -- ↑ Here
RETURN 2; -- INTEGER
END;
$$ LANGUAGE plpgsql;

所以,我如下图设置

RETURNS INTEGER
,然后错误就解决了:

CREATE FUNCTION addition() RETURNS INTEGER AS $$
BEGIN                            -- ↑ Here
RETURN 2; -- INTEGER
END;
$$ LANGUAGE plpgsql;

或者,我没有返回任何内容,无论有没有

RETURN;
,如下所示,然后错误就解决了:

CREATE FUNCTION addition() RETURNS VOID AS $$
BEGIN                            -- ↑ Here
RETURN; -- Nothing
END;
$$ LANGUAGE plpgsql;

或者:

CREATE FUNCTION addition() RETURNS VOID AS $$
BEGIN                            -- ↑ Here
-- RETURN; -- Nothing
END;
$$ LANGUAGE plpgsql;
© www.soinside.com 2019 - 2024. All rights reserved.