如何创建不返回任何内容的函数

Posted

技术标签:

【中文标题】如何创建不返回任何内容的函数【英文标题】:How to create function that returns nothing 【发布时间】:2012-12-22 09:47:39 【问题描述】:

我想用pl/pgsql 编写一个函数。 我正在使用 PostgresEnterprise Manager v3 并使用 shell 来创建一个函数,但是在 shell 中我必须定义返回类型。如果我不定义返回类型,我将无法创建函数。

如何创建没有返回结果的函数,即创建新表的函数?

【问题讨论】:

Please check out my answer if using PostgreSQL 11+ for a method of doing this with PROCEDUREs 【参考方案1】:

使用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;

【讨论】:

对于其他读者,请注意#variable_conflict 指令与其余答案没有任何关系。它只是示例函数的一部分;唯一重要的是RETURNS void。另外,很酷,我不知道 PL/PgSQL 有编译指示。 这是一个使用#variable_conflict的相关案例:dba.stackexchange.com/a/105828/3684 如何在另一个函数中使用这个函数?如果我尝试不使用SELECT * FROM stamp_user(...),那么我会得到error: query has no destination for result data,如果我只写stamp_user(...),那么我会得到syntax error @pir 你所说的完全没有道理。但是,如果您不想对 SELECT 数据执行任何操作,请使用 PERFROM。如果你这样做。你会想要 SELECT * INTO _record 其中 _record 是用 DECLARE _record RECORD 定义的;在 BEGIN 语句之前【参考方案2】:

函数必须总是返回一些东西,尽管你可以使用像

这样的过程
do $$

并从正常功能开始,例如

declare
...

但如果您仍想执行某个功能,只需在 returns 之后添加 void

【讨论】:

【参考方案3】:

PostgreSQL 11+:PROCEDUREs

PostgreSQL 11 introduces PROCEDUREs 基本上是不返回任何内容的函数,但使用 CALL 而不是 SELECT 调用,

如何创建没有返回结果的函数,即创建新表的函数?

这样,

=# CREATE PROCEDURE create_table_foo()
AS $$
  CREATE TABLE foo ( id int )
$$ LANGUAGE sql;

=# CALL create_table_foo();


=# \d foo;
                Table "public.foo"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 id     | integer |           |          | 

【讨论】:

以上是关于如何创建不返回任何内容的函数的主要内容,如果未能解决你的问题,请参考以下文章

没有从 postgresql 函数返回任何东西?

如果搜索参数为空白或缺失/错误,我如何使用 Xpath 函数“contains()”不返回任何内容?

Fetch Request 执行方法不返回任何内容

在函数中返回三个 int 中的最小值不返回任何内容

解析器函数不返回任何内容

main 函数不返回任何内容。为啥? [复制]