如何创建一个返回空值的函数

161
我想用pl/pgsql编写一个函数。我正在使用Postgres Enterprise Manager v3,并在shell中创建函数,但是在shell中必须定义返回类型。如果我不定义返回类型,我就无法创建函数。
如何创建一个没有返回结果的函数,例如创建一个新表的函数?

如果您使用PostgreSQL 11+,请查看我的答案以了解使用PROCEDURE进行此操作的方法。链接 - Evan Carroll
4个回答

254

像下面这样使用RETURNS void

CREATE FUNCTION stamp_user(id int, comment text) RETURNS void AS $$
    #variable_conflict use_variable
    DECLARE
        curtime timestamp := now();
    BEGIN
        UPDATE users SET last_modified = curtime, comment = comment
          WHERE users.id = id;
    END;
$$ LANGUAGE plpgsql;

35
请注意,对于其他读者而言,“#variable_conflict”指令与答案的其余部分毫无关系。 它只是一个示例函数的一部分;唯一重要的部分是“RETURNS void”。另外,很酷,我不知道PL/PgSQL有编译指示。 - Craig Ringer
这里有一个相关案例,使用了#variable_conflict:http://dba.stackexchange.com/a/105828/3684 - Erwin Brandstetter
3
我该如何在一个函数中使用另一个函数?如果我不使用 SELECT * FROM stamp_user(...),会出现“查询结果没有目的地”的错误;而如果我只写 stamp_user(...),则会出现语法错误。 - pir
@pir 你说的话不是很有意义。但是,如果你不想对SELECT数据做任何操作,请使用PERFROM。如果你想要操作数据,你需要在BEGIN语句之前用DECLARE _record RECORD;定义_record,然后使用SELECT * INTO _record。 - caleb baker
1
回答有些晚了,但是为了澄清@pir的评论和未来读者的理解,评论中的问题和回答存在误解。当调用您的函数时,如果看到错误query has no destination for result data,您很可能在函数中使用了SELECT。因此,请将SELECT替换为PERFORM,然后像往常一样使用SELECT yourFunction()调用您的函数。PERFORM仅在pl/pgsql上下文中有效。请参见链接 - dian jin


1

函数必须始终返回某些内容,虽然您可以使用类似于过程的方法

do $$

并以普通函数开始,如:

declare
...

但如果你仍然想要一个函数,只需在returns后面添加void


0

在接受的答案基础上补充一点,如果在调用函数时出现错误 query has no destination for result data,那么你很可能在 YOUR FUNCTION 中的某个语句中使用了 SELECT。将 SELECT 替换为 PERFORM,然后使用 SELECT yourFunction() 按照正常方式调用函数。

注意: PERFORM 只在 pl/pgsql 上下文中有效。请参见 link


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接