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

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

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

【问题讨论】:

标签: postgresql function plpgsql void


【解决方案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 |           |          | 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 2017-06-23
      • 2016-08-10
      相关资源
      最近更新 更多