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

Kab*_*abi 95 postgresql function plpgsql void

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

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

sqr*_*ept 145

使用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;
Run Code Online (Sandbox Code Playgroud)

  • 对于其他读者,请注意`#variable_conflict`指令与其余答案没有任何关系*.它只是示例函数的一部分; 唯一重要的一点是`RETURNS void`.另外,很酷,我不知道PL/PgSQL有pragma. (18认同)
  • 如何在另一个函数中使用这个函数?如果我尝试不使用 `SELECT * FROM stamp_user(...)`,那么我会收到 `error: query has no destination for result data`,如果我只写 `stamp_user(...)`,那么我会收到 `syntax error` . (2认同)
  • 问题迟到了,但为了清楚起见,回复了 @pir 的评论和未来的读者,评论的问题和回复中存在误解。调用函数时,如果您看到错误“查询没有结果数据的目标”,则您很可能在函数中使用了“SELECT”。因此,在函数中将“SELECT”替换为“PERFORM”,然后使用“SELECT yourFunction()”正常调用函数。`PERFORM` 仅在 pl/pgsql 上下文中有效。请参阅[链接](/sf/answers/1596368231/) (2认同)

Eva*_*oll 13

PostgreSQL 11+:PROCEDUREs

PostgreSQL 11 引入了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 |           |          | 
Run Code Online (Sandbox Code Playgroud)