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

ehxuflar  于 11个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(273)

我试图提取对应于特定日期和user_id的记录的计数,这些记录在数据库中没有对应于下一个较晚日期的user_id。这是我试图完成它的方式(使用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。这是语法错误还是更严重的推理错误?

snvhrwxg

snvhrwxg1#

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代码中一样排除它。

dfty9e19

dfty9e192#

下面是同样的错误:
错误:RETURN在返回void的函数中不能有参数
因为RETURNS VOIDRETURN 2;INTEGER)的类型在PL/pgSQL function中是不一样的,如下所示:

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

字符串
所以,我设置RETURNS INTEGER如下所示,然后错误是solvd:

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


或者,我没有返回任何有或没有RETURN;,如下所示,那么错误是solvd:

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


或者:

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

相关问题