相关疑难解决方法(0)

PostgreSQL函数返回void

写入PL/pgSQLSQL可定义为的函数RETURNS void.我最近偶然发现了结果的奇怪差异.

请考虑以下演示:

CREATE OR REPLACE FUNCTION f_sql()
  RETURNS void AS
'SELECT NULL::void' -- "do nothing", no special meaning
  LANGUAGE sql;

CREATE OR REPLACE FUNCTION f_plpgsql()
  RETURNS void AS
$$
BEGIN
NULL; -- "do nothing", no special meaning
END;
$$  LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

该函数f_sql()使用唯一可能的方法SELECT(在SQL函数中作为最后一个命令)RETURNS void.我使用它只是因为它是用于此测试目的的最简单方法 - 任何其他函数,例如,UPDATE或者DELETE显示相同的行为.

现在,void是一种虚构的类型.虽然plpgsql功能似乎返回一个空字符串类型相当于void有效,''::void.该sql功能似乎回归NULL::void.

db=# SELECT f_sql() IS NULL; …
Run Code Online (Sandbox Code Playgroud)

postgresql null stored-procedures plpgsql void

17
推荐指数
1
解决办法
1万
查看次数

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

我正在尝试提取与特定日期和 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
Run Code Online (Sandbox Code Playgroud)

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

sql syntax for-loop plpgsql postgresql-9.2

5
推荐指数
1
解决办法
2436
查看次数

Postgres调用void函数

我有一个无效的plsql函数:

CREATE OR REPLACE FUNCTION do_something(p_id BIGINT) 
RETURNS void
AS $$
BEGIN
   insert ....
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
Run Code Online (Sandbox Code Playgroud)

我想从另一个plsql函数中调用此函数,但是要在一个查询中进行如下操作:

SELECT  do_something(m.id) 
FROM    MyTable m
WHERE   m.IsActive;
Run Code Online (Sandbox Code Playgroud)

当我运行时,sproc我得到:

错误:查询没有结果数据的目的地提示:如果要舍弃SELECT的结果,请改用PERFORM。

是否可以将void函数作为select语句的一部分来调用?

postgresql plpgsql postgresql-9.2

3
推荐指数
1
解决办法
4732
查看次数