写入PL/pgSQL或SQL可定义为的函数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) 我正在尝试提取与特定日期和 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 数组。是否有语法或更重要的推理错误?
我有一个无效的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语句的一部分来调用?